js初学总结
基础
交换变量方式
//利用第三方变量进行交换
var num1 = 10;
var num2 = 20;
var temp;
temp = num1;
num1 = num2;
num2 = temp;
console.log(num1);
console.log(num2);
//一般适用于数字交换
var num1 = 10;
var num2 = 20;
num1 = num1 + num2;
num2 = num1 - num2;
num1 = num1 - num2;
console.log(num1, num2);
类型转换
//类型转换
parseInt()---------->转整数
parseFloat()-------->转浮点数
Number()------------>转数字
.toString()---------->转字符串(严格)
String()------------->转字符串(不严格)
Boolean()------------>布尔值(true或false)
变量
var number=10;
var num1=20;
var name ="小黑";
var flag = true;
var nll = null;
var obg = Object();
字符串
//字符串可以用单引号,双引号括起来
var str1='jfdsghiuijhvjfkvui';
var str2="jfdsghiuijhvjfkdsgfyugfvui";
//获取字符串长度用变量名.length
console.log(str1.length);
console.log(str2.length);
// 字符串拼接用+
var pinJie1= "我是";
var pinJie2= "小明";
console.log(pinJie1+pinJie2);
操作符
操作符:一些符号-----用来计算
算数运算符: + - * / %
算数运算表达式:由算数运算符连接起来的表达式
一元运算符: 这个操作符只需要一个操作数就可以运算的符号 ++ --
二元运算符: 这个操作符需要两个操作数就可以运算,
三元运算符: -----不讲,明天讲
复合运算符: += -= *= /= %=
复合运算表达式:由复合运算符连接起来的表达式
*
* var num=10;
* num+=10;------>就是:num=num+10;
* console.log(num);20
*
关系运算符: > < >= <= ==不严格的 ===严格的 !=不严格的不等 !==严格的不等
* 关系运算表达式:由关系运算符连接起来的表达式
* 关系运算表达式的结果是布尔类型
* 逻辑运算符:
* &&---逻辑与--并且
* ||---逻辑或---或者
* !---逻辑非---取反--取非
* 逻辑运算表达式:由逻辑运算符连接起来的表达式
* 表达式1&&表达式2
* 如果有一个为false,整个的结果就是false
* 表达式1||表达式2
* 如果有一个为true,整个的结果为true
* !表达式1
* 表达式1的结果是true,整个结果为false
* 表达式1的结果是false,整个结果为true
*
* 赋值运算符: =
* */
//字面量: 把一个值直接赋值给一个变量
//声明变量并初始化
// var num=10;
//
// var flag=true;
//
// var str="哈哈哈";
//
// var y=10;
// var n=y;
类型转换
//转整数parseInt
console.log(parseInt("10"));
console.log(parseInt("10dsj"));
console.log(parseInt("dfe10"));
console.log(parseInt("1fvdsfg0"));
console.log(parseInt("fd1fvdsfg0sd"));
/*
输出结果
10
10
NaN
1
NaN
*/
//转小数parseFloat
console.log(parseFloat("10.98"));
console.log(parseFloat("10.98dsj"));
console.log(parseFloat("dfe10.98"));
console.log(parseFloat("1fvdsfg0"));
console.log(parseFloat("fd1fvdsfg0.98sd"));
/*
输出结果
10.98
10.98
NaN
1
NaN
*/
//转数字
console.log(Number("10.98"));
console.log(Number("10.98dsj"));
console.log(Number("dfe10.98"));
console.log(Number("1fvdsfg0"));
console.log(Number("fd1fvdsfg0.98sd"));
/*
输出结果
10.98
NaN
NaN
NaN
NaN
*/
//转字符串
// 两种方式:1. toString 2. String
var num1=10;
console.log(num1.toString());
//有意义
var num2;
var num3=null;
console.log(String(num2));
console.log(String(num3));
//无意义,以及为空用
// 转Boolean布尔类型 重要!!!
console.log(Boolean(10)); //true
console.log(Boolean(0)); //false
console.log(Boolean(10.43)); //true
console.log(Boolean(-10)); //true
console.log(Boolean("")); //false
console.log(Boolean(null)); //false
/*
只要结果不为0,空,未定义就位true
*/
进制
// 十进制12
var num1 = 12;
// 八进制8
var num2 = 010;
// 十六进制20
var num3 = 0x14;
console.log(num1);
console.log(num2);
console.log(num3);
//最大最小值的范围
console.log(Number.MAX_VALUE);
console.log(Number.MIN_VALUE);
// 不要用小数验证小树
var x=0.1;
var y=0.2;
var sum=x+y;
console.log(sum);
// 猜测,应该是存在小数精度问题
顺序、分支(选择)、循环(重复)
if语句
// if-else
// 用到转换以及获取用户输入
var age=parseInt(prompt("请输入年龄"));
if (age>=18){
console.log("可以看电影");
} else {
console.log("年龄太小,不让看");
}
//else-else if
var results = Number(prompt("请您输入成绩"));
if (results > 90 && results <= 100) {
console("A");
} else if (results <= 90 && results > 80) {
console.log("B");
} else{
}
switch语句
var level="A";
switch (level) {
case "A":console.log("90~100之见");break;
case "B":console.log("80~90之见");break;
case "C":console.log("70~80之见");break;
case "D":console.log("60~70之见");break;
default:
console.log("60以下");break;
}
if与switch区别
/*
*if-else if-else if...
*一般是用于范围判断
*switch case
* 一般用于具体值的判断
*
* */
while循环
var sum = 0;
var i = 0;
while(i<=100){
sum=sum+i;
i++;
}
console.log(parseFloat(sum));
do while循环
// do while循环
/*
* 结构
* do{
* 循环体
* }while(条件);
*至少执行一次
for循环
* for循环
*
* 语法:
* for(表达式1;表达式2;表达式3){
* 循环体;
* }
*
* 执行过程:
* 先执行一次表达式1,然后判断表达式2;如果不成立则直接跳出循环
* 如果表达式2成立,执行循环体的代码,结束后,跳到表达式3执行,然后跳到表达式2,判断表达式2是否成立,不成立,则跳出循环
* 如果表达式2成立,则执行循环体,然后再跳到表达式3,再跳到表达式2,判断是否成立,一直如此
*
* for(var i=0;i<10;i++){
*
* }
*/
一元运算符
++在后,先算运算,之后再减一
++在前,先自增,之后再运算
三元表达式
//求最大值
var n1=20;
var n2=40;
var maximum=n1>n2?n1:n2;
console.log(maximum);
break
// 找到100~200第一个能被7整除的数字
for (var i=100;i<=200;i++){
if (i%7==0){
console.log(i);
break;
}
}
总结:break会跳出当前循环
continue
//目的:continue 在循环中遇到continue,直接开始下一次循环
// 求100~200之见所有除了个位数为3的和
var sum = 0;
var i = 100;
while (i <= 200) {
if (i % 10 == 3) {
i++;
continue;
}
sum += i;
i++;
}
console.log(sum);
数组
//数组:一组有序的数据
//数组的作用:可以一次性存储多个数据
//数组的定义:
/*
* 1. 通过构造函数创建数组
* 语法:
* var 数组名=new Array();
* var array=new Array();//定义了一个数组
* 数组的名字如果直接输出,那么直接就可以把数组中的数据显示出来,如果没有数据,就看不到数据
*
* var 数组名=new Array(长度);
* 如果数组中没有数据,但是有长度---,数组中的每个值就是undefined
*/
// var array=Array();
// console.log(array);
/*
* 2. 通过自变量的方式
* 语法:var 数组名=[]; 空数组
*
* var arr=[5];
* console.log(arr);
*/
//数组索引从0开始
/*var arr=[10,20.30,40];
console.log(arr[2]);
// 结果40
// 修改某个数组位置的值
arr[1]=1000;
console.log(arr[1]);
// 结果1000*/
// 输出数组长度
// var sz=[10,20,30];
// console.log(sz.length);
// 遍历数组
var arr=[10,20,30,40,50];
for (i=0;i<arr.length;i++){
console.log(arr[i]);
}
// 冒泡排序法
// 原理:每个数和后面的数依次比较,如果大于或者小于则交换位置,最终实现排序
var arr = [10, 2, 3, 54, 43, 22, 67, 90];
for (i = 0; i < arr.length - 1; i++) {
for (j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
console.log(arr);
函数
函数1
//函数:把一坨重复的代码封装,在需要的时候直接调用即可
//函数的作用:代码的重用
/*
*
* 函数的定义
* 语法:
*
* function 函数名字(){
* 函数体-----一坨重复的代码
* }
*
* 函数的调用:
*
* 函数名();
*
*
*
* */
//函数需要先定义,然后才能使用
//函数名字:要遵循驼峰命名法
//函数一旦重名,后面的会把前面的函数覆盖
//Ctrl +鼠标左键---->转到定义
//一个函数最好就是一个功能
函数2
//函数定义,还没有执行
function consoleSum(x, y) {
var sum = x + y;
console.log(sum);
}
// 传递值,函数执行
sum1 = 10;
sum2 = 20;
consoleSum(sum1, sum2);
/*
* 函数参数:
* 在函数定义的时候,函数名字后面的小括号里的变量就是参数,目的是函数在调用的时候,用户传进来的值操作
* 此时函数定义的时候后面的小括号里的变量叫参数;写了两个变量,就有两个参数,
* 在函数调用的时候,按照提示的方式,给变量赋值--->就叫传值,把这个值就传到了变量(参数)中
*
* 形参:函数在定义的时候小括号里的变量叫形参
* 实参:函数在调用的时候小括号里传入的值叫实参,实参可以是变量也可以是值
*
*
* */
*/
//set:设置
//get:获取
//函数的返回值:在函数内部有return关键字,并且在关键字后面有内容,这个内容被返回了
//当函数调用之后,需要这个返回值,那么就定义变量接收,即可
/*function getSum(x,y) {
return x + y;
}
// getSum(10,20);
var ad=getSum(10,20);
console.log(ad);*/
/*
*
* 如果一个函数中有return ,那么这个函数就有返回值
* 如果一个函数中没有return,那么这个函数就没有返回值
* 如果一个函数中没有明确的返回值,那么调用的时候接收了,结果就是undefined
* (没有明确返回值:函数中没有return,函数中有return,但是return后面没有任何内容)
* 函数没有返回值,但是在调用的时候接收了,那么结果就是undefined
* 变量声明了,没有赋值,结果也是undefined
* 如果一个函数有参数,有参数的函数
* 如果一个函数没有参数,没有参数的函数
* 形参的个数和实参的个数可以不一致
* return 下面的代码是不会执行的
*
*
*
* */
复习
/*
*
* break:在循环中遇到这个关键字,直接跳出当前所在的循环
* continue:在循环中遇到这个关键字,直接进行下一次循环
* 数组:存储一组有序的数据,数据类型可以不一样
* 数组的作用:一次性存储多个数据
* 数组元素:数组中存储的每个数据,叫数组元素,存储了5个数据,有5个数组元素
* 数组的长度:数组的元素的个数,叫数组的长度:数组名.length--->就是长度,数组的长度是可以改变的
* 索引(下标):存储数组元素的编号,从0开始,到数组的长度-1结束
* 索引是用来存储和读取数组元素的
* 遍历数组:通过循环的方式找到数组中的每个数据
* 冒泡排序:
* 求数组的和,最大值,最小值,平均值
*
* 数组定义的方式:
* 1. 通过构造函数定义数组
* var 数组名=new Array();空数组 Array()就是构造函数
* var 数组名=new Array(长度);是设置数组的初始的长度,长度是可以改变的
* var 数组名=new Array(值,值,值...);定义数组并设置数组中的元素值
* 2. 字面量的方式定义数组
* var 数组名=[];空数组
* var 数组名=[10];这个数组有一个元素,值是10,长度是1
* 数组变量
* for(var i=0;i<数组名.length;i++){
*
* }
*
*
* 函数:把一些重复的代码封装起来,在需要的时候直接调用这个函数就可以了
* 函数作用:代码的重用
* 函数定义:
* function 函数名(){
* 函数体
* }
* 函数调用:
* 函数名();
*
* 参数:形参和实参
* 形参:函数定义的时候函数名字后面的小括号里的变量就是参数,是不需要写var
* 实参:函数调用的时候小括号里传入的变量或者是值,都是实参
* 返回值:函数中如果有return,那么这个函数就有返回值
* 如果函数中没有return,那么这个函数没有返回值
* 如果函数中有return,但是后面什么内容都没有,这个函数没有明确返回值
* 如果一个函数没有明确的返回值,函数调用了,并且接收了,那么此时接收的结果undefined
* 如果直接输出函数名字,那么是这个函数的代码
* 无参数无返回值的函数
* function f1(){
*
* }
* 有参数无返回值的函数,2个参数
* function f2(x,y){
*
* }
* 无参数有返回值的函数
* function f3(){
* return 100;
* }
* 有参数有返回值的函数
* function f4(x){
* return "您好";
* }
*
*
*
*
* */
//隐式全局变量
// for( i=0;i<10;i++){
// console.log("今天天气真好");
// }
函数的其他定义形式
/*
* 时间:2019年4月17日 19:04:52
* 目的:命名函数 匿名函数
* 结果:
* --------------------
*
*
*
* --------------------
*
**/
/*
* 命名函数:函数如果有名字,就是命名函数
*
* 匿名函数:函数如果没有名字,就是匿名函数
*
* 函数的另一种定义方式
* 函数表达式:
* 把一个函数给一个变量,此时形成了函数表达式
* var 变量=匿名函数;
* 例子:
* var f1=function (){
*
* };
* 如果是函数表达式,那么此时前面的变量中存储的就是一个函数,而这个变量就相当于是一个函数,就可以直接加小括号调用了
* f1();
*
* 注意:
* 函数表达式后面,赋值结束后,要加分号
*
*
*
* 函数定义:
* 1. 函数声明--函数定义
* function 函数名(){
* 函数体
* }
*
* */
// 匿名函数
// 只是没有名字,并且把函数赋给了f1
/*var f1=function () {
console.log("哈哈");
};
f1();*/
// 匿名函数可以重复调用定义,不用担心函数重命名
/*var f1 = function () {
console.log("我是第一个");
};
f1();
f1 = function () {
console.log("我是第二个");
};
f1();*/
// 函数的自调用,自调用函数
//就是一次性,用完就没有,不担心命名冲突
(function () {
console.log("我是自调用函数");
})();
函数作为参数使用
// 函数可以作为参数使用,如果一个函数作为参数使用,那么我们可以说这个参数(函数)叫做回调函数
// 只要看到一个函数作为参数使用了,那就是回调函数
function f1(fn) {
fn();
}
function f2() {
console.log("这是回调参数");
}
f1(f2);
函数作为返回值使用
function f1() {
return function () {
console.log("返回值");
}
}
var ff = f1();
ff();
函数也是一种数据类型
function f() {
}
console.log(typeof f);
// 结果,函数类型function
冒泡排序
//从大到小
var arr = [10, 20, 3, 4, 5, 45];
// 冒泡排序,肯定有进行比较,之后交换数据
//进行轮数循环
for (var i = 0; i < arr.length - 1; i++) {
//进行每轮比较
for (var j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
// 利用第三方变量交换数据
var temp;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
console.log(arr);
域解析
/*
* 结果:预解析可以吧一些定义代码提到前面
* --------------------
* 预解析:就是在解析代码之前
* 预解析做什么事?
* 把变量的声明提前了----提前到当前所在的作用域的最上面
* 函数的声明也会被提前---提前到当前所在的作用域的最上面
* 先提升var,在提升function
* 预解析会分段(多对script标签中函数重名,预解析不会冲突)
* --------------------
*
**/
作用域
//作用域:使用范围
/*
*
* 全局变量:声明的变量是使用var声明的,那么这个变量就是全局变量,全局变量可以在页面的任何位置使用
* 除了函数以外,其他的任何位置定义的变量都是全局变量
* 局部变量:在函数内部定义的变量,是局部变量,外面不能使用
* 全局变量,如果页面不关闭,那么就不会释放,就会占空间,消耗内存
*
* 全局作用域:全局变量的使用范围
* 局部作用域:局部变量的使用范围
*
* 块级作用域:一对大括号就可以看成是一块,在这块区域中定义的变量,只能在这个区域中使用,但是在js中在这个块级作用域中定义的变量,外面也能使用;
* 说明:js没有块级作用域,只有函数除外
*
* 隐式全局变量:声明的变量没有var,就叫隐式全局变量
* 全局变量是不能被删除的,隐式全局变量是可以被删除的
* 定义变量使用var是不会被删除的,没有var是可以删除的
*
*
* */
// 在函数作用域内加var定义的变量是局部变量,不加var定义的就成了全局变量。
// function f1() {
// number=1000;//是隐式全局变量
// }
// f1();
// console.log(number);
作用域链
/*
* 时间:2019年4月6日 12:26:11
* 目的:作用域链
* 结果:函数套函数,如果函数里面找不到变量,就去上一级找,直到找不到报错
* --------------------
*
*
*
* --------------------
*
**/
var num=10;
function f1() {
var num=20;
function f2() {
var num=30;
function f3() {
var num=50;
console.log(num);
}
f3();
}
f2();
}
f1();
arguments伪数组
/*
* 时间:2019年4月17日 19:04:52
* 目的:arguments //意思:参数
* 结果:获取函数在调用的时候,传入了几个参数
* --------------------
* 使用arguments可以获得每个传入对象的值
*
*
* --------------------
*
**/
/*function f1() {
console.log(arguments.length);
console.log(arguments);
}
f1(10,20,30,40);*/
// 计算n个数字的和
function nSum() {
var sum=0;
//把arguments当成数组使用 //注意:是伪数组
for (var i=0;i<arguments.length;i++){
sum+=arguments[i];
}
return sum;
}
console.log(nSum(10,20,30,40));
复习
/*
* 复习:
* 函数:把一些重复的代码封装在一个地方,在需要的时候直接调用这个地方的代码就可以了
*
* 函数作用:代码重用
*
* 函数的参数:
* 1.形参:函数定义的时候,函数名字后面的小括号里的变量
* 2.实参:函数调用的时候,函数名字后面的小括号里的变量或者值
*
* 返回值:
* 函数中有return,函数有返回值
* 函数中没有return,函数没有返回值
* 没有明确返回值:函数中没有return或者return后面没有任何内容
* 如果一个函数没有明确的返回值,接收这个函数,结果是undefined
*
* 无参数无返回值的函数
* 无参数有返回值的函数
* 有参数无返回值的函数
* 有参数有返回值的函数
*
* arguments----->可以获取函数调用的时候,传入的实参的个数
* arguments是一个对象,是一个伪数组
* arguments.length--->是实参的个数
* arguments[索引]---->实参的值
*
* 作用域:变量的使用范围
* 全局作用域:全局变量在任何位置都可以使用的范围
* 局部作用域:局部变量只能在某个地方使用---函数内
* 作用域链:在一个函数中使用一个变量,先在该函数中搜索这个变量,找到了则使用,找不到则继续向外面找这个变量,找到则使用,一直找到全局作用域,找不到则是undefined
* 全局变量:只要是在函数外面声明的变量都可以看成或者是理解成是全局变量
* 局部变量:在函数中定义的变量
*
* 预解析:在执行代码之前做的事情
* 变量的声明和函数的声明被提前了,变量和函数的声明会提升到当前所在的作用域的最上面
* 函数中的变量声明,会提升到该函数的作用域的最上面(里面)
* 如果有多对的script标签都有相同名字的函数,预解析的时候是分段的,互不影响
*
*
*
*
*
*
* */
对象
简单类型和复杂类型
//原始数据类型: number,string,boolean,undefined, null,object
//基本类型(简单类型),值类型: number,string,boolean
//复杂类型(引用类型):object
//空类型:undefined,null
//值类型的值在哪一块空间中存储? 栈中存储
//引用类型的值在哪一块空间中存储?对象在堆上存储,地址在栈上存储
//var num=10;//值类型,值在栈上
//var obj={};//复杂类型,对象在堆,地址(引用)在栈
//值类型之间传递,传递的是值
//引用类型之间传递,传递的是地址(引用)
//值类型作为函数的参数,传递的是值
//引用类型作为函数的参数,传递的是地址
编程思想的概述
//编程思想: 把一些生活中做事的经验融入到程序中
//面向过程: 凡事都要亲历亲为,每件事的具体过程都要知道,注重的是过程
//面向对象: 根据需求找对象,所有的事都用对象来做,注重的是结果
/*
*
*
* 面向对象特性:封装,继承,多态 (抽象性)
* js不是面向对象的语言,但是可以模拟面向对象的思想
* js是一门基于对象的语言:
* 万物皆对象:---------->程序猿 程旭媛
*
* * 什么是对象?
* 看的见,摸得到,具体特指的某个东西
*
* 找对象
* 描述找对象
* 文字描述找对象
* 小明牵着小黄去逛街
* 一台电视机正在播放影片
*
*
*
*
* 分析对象有什么特点:特征和行为
*
* 对象:有特征和行为,具体特指的某一个事物
*
*
*
* 对象:有属性和方法,具体特指的某个事物
*
*
*
*
* 没有对象
*
*
* 创建对象
*
*
*https://www.codecombat.cn/play/dungeon
*
*
*
* */
创建对象的图解
//1 调用构造函数创建对象
var obj=new Object();
//2. 自定义构造函数创建对象
//自定义构造函数
function Person(name,age) {
this.name=name;
this.age=age;
this.sayHi=function () {
console.log("您好,我叫:"+this.name);
};
}
//创建对象----实例化一个对象,并初始化
var per=new Person("小明",20);
per.name="张三";
//四件事:
/*
* 1. 开辟空间,存储创建的新的对象
* 2. 把this设置为当前的对象
* 3. 设置对象的属性和方法的值
* 4. 返回创建后新的对象
*
*
* */
// 内存分为栈和堆
调用系统的构造函数创建对象
//创建对象三种方式:
/*
*
* 1.调用系统的构造函数创建对象
* var 变量名= new Object(); Object 是系统的构造函数 Array
*
* 2.自定义构造函数创建对象(结合第一种和需求通过工厂模式创建对象)
*
*
* 3.字面量的方式创建对象
*
*
* */
//构造函数就是首字母大写,后面小写,如Array,Object
//第一种创建对象的方式
//小苏举例子:
//实例化对象
var obj = new Object();
//对象有特征---属性和行为---方法
//添加属性-----如何添加属性? 对象.名字=值;
obj.name = "小苏";
obj.age = 38;
obj.sex = "女";
//添加方法----如何添加方法? 对象.名字=函数;
obj.eat = function () {
console.log("我喜欢吃油炸榴莲凉拌臭豆腐和大蒜");
};
obj.play = function () {
console.log("我喜欢玩飞机模型");
};
obj.cook = function () {
console.log("切菜");
console.log("洗菜");
console.log("把菜放进去");
console.log("大火5分钟");
console.log("出锅");
console.log("凉水过一下");
console.log("放料,吃");
};
console.log(obj.name);//获取--输出了
console.log(obj.age);
console.log(obj.sex);
//方法的调用
obj.eat();
obj.play();
obj.cook();
调用自定义构造函数创建对象
//自定义构造函数创建对象,我要自己定义一个构造函数,自定义构造函数,创建对象
//函数和构造函数的区别;名字是不是大写(首字母是大写)
function Dog(name, age) {
this.name = name;
this.age = age;
this.hello = function () {
console.log("你好我叫" + this.name + "今年" + this.age);
}
}
var dog = new Dog("小明", 18);
var cat = new Dog("小军", 19);
dog.hello();
cat.hello();
console.log(Dog() instanceof dog);
工厂模式创建对象
/*
*
* 如何获取该变量(对象)是不是属于什么类型的?
* 语法:
* 变量 instanceof 类型的名字----->布尔类型,true就是这种类型,false不是这种类型
* 在当前的对象的方法中,可以使用this关键字代表当前的对象
*
*
* */
//对象不能分辨出到底是属于什么类型?
//如何一次性创建多个对象?把创建对象的代码封装在一个函数中
//工厂模式创建对象
factoryCreation=function (name,age) {
var obg=new Object();
obg.name=name;
obg.age=age;
obg.greet=function () {
console.log("你好,我叫"+this.name+"今年"+this.age+"岁了");
};
obg.greet();
};
factoryCreation("小军",15);
factoryCreation("小明",16);
//工厂模式就是提前定义封装好,到时候直接传内容用就行
内置对象
/*
时间:2019年5月24日 20:20:00
目的关于对象
---------------------
在Webstorm中输出的结果是:
---------------------
*/
// js学习中的三种对象
/*
* 1.内置对象---------js系统自带的对象
* 2.自定义对象-------自己定义的构造函数创建的对象
* 3.浏览器对象-------BOM的时候讲
* */
// 如何验证变量是不是对象?
console.log(Array instanceof Object);
var obj={};
console.log(obj instanceof Object);
// 内置对象
/*
* Math
* Date
* String
* Array
* */
设置和获取属性的另一种方法
通过中括号以及双引号的方式调用
//自定义构造函数
function People(name, age) {
this.name = name;
this.age = age;
this.eat = function () {
console.log("拿筷子");
console.log("吃");
};
}
var people_1 = new People("小明", 18);
//点语法
console.log(people_1.name);
console.log(people_1.age);
people_1.eat();
//中括号
console.log(people_1["name"]);
console.log(people_1["age"]);
people_1["eat"]();
自变量的方式创建对象
// 原来方式
/*
// 调用构造函数
var obj = new Object();
obj.name = "小米";
//自定义构造函数
function Obg(name, age) {
this.name = name;
this.obg = obg;
}
var obg = new Obg("小米", 18);
*/
// 自变量
/*var obg = {};
obg.name = "小明";
obg.age = 18;
obg.ganHuo = function () {
console.log(this.name + "会干活");
};
console.log(obg.name);
console.log(obg.age);
obg.ganHuo();*/
/*var obg = {
name: "小明",
age: 18,
ganHuo: function () {
console.log(this.name + "会干活");
}
};
console.log(obg.name);
console.log(obg.age);
obg.ganHuo();*/
// 现在可以暂时理解为只要有花括号的就是对象
自定义构造函数创建对象做了四件事
目的:理解自定义对象,系统做了什么事情
//自定义构造函数创建对象,我要自己定义一个构造函数,自定义构造函数,创建对象
//函数和构造函数的区别;名字是不是大写(首字母是大写)
/*function Dog(name, age) {
this.name = name;
this.age = age;
this.hello = function () {
console.log("你好我叫" + this.name + "今年" + this.age);
}
}
var dog = new Dog("小明", 18);
var cat = new Dog("小军", 19);
dog.hello();*/
/*
*
* 1. 在内存中开辟(申请一块空闲的空间)空间,存储创建的新的对象
* 2. 把this设置为当前的对象
* 3. 设置对象的属性和方法的值
* 4. 把this这个对象返回
*
*
* */
//通过自定义构造函数实现下面的例子:
//创建一个图片的对象,图片有宽,有高,有大小(4M),图片可以展示内容
/*function Tupian(kuan,gao,daxiao) {
this.kuan=kuan;
this.gao=gao;
this.daxiao=daxiao;
this.xingwei=function () {
console.log("展示内容");
};
}
var tuPian=new Tupian("500px","200px","4M");
console.log(tuPian.kuan);
console.log(tuPian.gao);
console.log(tuPian.daxiao);
tuPian.xingwei();*/
总结对象
//字面量创建对象的缺陷: 一次性的对象
// var obj={
// name:"小明",
// age:38,
// sex:"女"
// };
// obj.name="小三";
// console.log(obj.name);
//点语法: 对象.名字=值; 对象.名字=函数;
//没有什么点,就有了
/*
*
* js是一门什么样的语言?
* 是一门解释性的语言
* 是一门脚本语言
* 是一门弱类型语言,声明变量都用var
* 是一门基于对象的语言
* 是一门动态类型的语言:
* 1. 代码(变量)只有执行到这个位置的时候,才知道这个变量中到底存储的是什么,如果是对象,就有对象的属性和方法,如果是变量就是变量的作用
* 2. 对象没有什么,只要点了,通过点语法,那么就可以为对象添加属性或者方法
*
*
*
* */
json格式的数据
//对象:有属性和方法,特指的某个事物
//对象:一组无序属性的集合的键值对,属性的值可以是任意的类型
// function Dog(name) {
// this.name=name;
// }
// function Person(name,age) {
// this.age=age;
// this.name=name;
// this.sex=true;
// this.dog={};
// this.play=function () {
// console.log("喜欢玩游戏");
// };
// }
//
// var sex=false;//男
// console.log(sex?"男":"女");
//JSON格式的数据:一般都是成对的,是键值对,
//json也是一个对象,数据都是成对的,一般json格式的数据无论是键还是值都是用双引号括起来的
// var obj={
// name:"小明"
// };
/*var json = {
"name": "小明",
"age": "10",
"sex": "男"
};*/
//遍历对象,是不能通过for循环遍历,无序
//key是一个变量,这个变量中存储的是该对象的所有的属性的名字
/* for (var key in json) {
console.log(key + "===========" + json[key]);
}*/
// var key="name";
// console.log(json[key]);
//可以通过for-in循环
//
// for(var key in json){
// //console.log(key);//json对象中的属性的名字
// console.log(json[key]);
// }
//对象中确实有这个属性对象.属性名字 或者对象[属性名字]
//一个一个的遍历出来
// var arr=[10,20,30];
// for(var i=0;i<arr.length;i++){
// console.log(arr[i]);
// }
//json数据练习
var json= {
"name": "小军",
"sex": "男",
"age": "16",
"eat": function () {
console.log("会吃饭");
}
};
for(var i in json){
console.log(i+"---------"+json[i]);
}
Math对象
*/
// Math 是一个内置对象, 它具有数学常数和函数的属性和方法。不是一个函数对象。
//MDN----在线的帮助文档
//实例对象:通过构造函数创建出来,实例化的对象
//静态对象:不需要创建,直接就是一个对象,方法(静态方法)直接通过这个对象名字调用,
//实例方法必须通过实例对象调用
//静态方法必须通过大写的对象调用
/*
* Math.PI---------------------π
* Math.E----------------------常数的底数
* Math.abs(值)----------------绝对值
* Math.ceil(值)---------------向上取整
* Math.floor(值)--------------向下取整
* Math.max(值,值,值)-----------找一组数字中的最大值
* Math.min(值,值,值)-----------找一组数字中的最小值
* Math.pow(x,y)---------------计算x的y次幂
* Math.sqrt(值)---------------计算数字的平方根
* Math.random()---------------产生随机数*/
// 实验
console.log(Math.PI); //打印π
console.log(Math.abs(-10)); //打印绝对值
console.log(Math.ceil(12.02)); //向上取整
console.log(Math.floor(12.99)); //向下取整
console.log(Math.fround(3.1)); //把小数转换成计算机存储的单精度小数 //实验,不推荐使用
console.log(Math.max(10, 20, 30, 2, 1)); //找一组数字中的最大值
console.log(Math.min(10, 20, 30, 2, 1)); //找一组数字中的最小值
console.log(Math.pow(10, 2)); //Math.pow()计算x的y次幂
console.log(Math.sqrt(16)); //计算数字的平方根
console.log(Math.random()); //产生随机数
// 范围0~1之见,如果需要产生整数的话需要这样
console.log(parseInt(Math.random()*5)+1); //0~5之见
console.log(parseInt(Math.random()*10)+1); //0~10之见
复习
/*
* 复习
* 编程思想:
* 面向过程:凡事亲力亲为,所有的事情的过程都要清楚,注重的是过程
* 面向对象:提出需求,找到对象,对象解决这个问题,我们要结果,注重的是结果
*
* 面向对象的特性:封装,继承,多态,(抽象性)
*
* JS是一门什么样的语言?
* 是一门解释性的语言
* 是一门脚本语言
* 是一门弱类型的语言
* 是一门基于对象的语言
* 是一门动态类型的语言
*
* 对象:有属性和方法,具体特指的某个事物
* 对象:js中就是一组无序的属性的集合
* 属性----特征
* 方法----行为
* 创建的对象的方式:
* 1.通过调用系统的构造函数创建对象 new Object()
* var obj1=new Object();
* 2.自定义构造函数创建对象
* var obj2=new 自定义构造函数();
* 3.字面量的方式创建对象
* var obj3={};
* 变量 instanceof 对象------->布尔类型,判断这个变量是不是这个类型的
*
* JSON格式的数据,都是键值对,成对的数据
* var obj={
* name:"小明"
* };
* var json={
* "name":"小明"
* };
*
* json的数据实际上就是格式化后的一组字符串的数据
*
* 对象设置属性的值的写法
* 对象.属性名字=值;----点语法
* 对象["属性的名字"]=值;-----
*
* 对象获取属性的值的写法
* 对象.属性
* 对象["属性"]
*
* 遍历对象
* for(var key in 对象){ key---是一个变量,这个变量中存储的是遍历的对象的属性的名字
*
* }
*
*
* 原始数据类型:number,string,boolean,null,undefined,object
* 基本类型(简单类型,值类型):number,string,boolean
* 复杂类型(引用类型):object
* 空类型:undefined,null
*
* 基本类型的值在栈上
* 复杂类型的对象在堆上,地址(引用)在栈上
*
* 值类型之间传递的是值
* 引用类型之间传递的是引用(地址)
*
*
* 对象分三种:内置对象,自定义对象,浏览器对象
* 内置对象:系统提供的
* 自定义对象:自己写的
* 浏览器对象:浏览器的
*
* Math 是一个对象,但是不是一个函数
* Math对象下的属性和方法都是静态
*
* 方法:
* Math.ceil()---向上取整
* Math.floor()---向下取整
* Math.Pi----圆周率的值
* Math.Max()---一组数字中的最大值
* Math.Min()---一组数字中的最小值
* Math.abs()----绝对值
* Math.random---随机数字
* Math.sqrt()----开平方
* Math.pow()----一个数字的多少次幂
*
*
*
*
* new 的执行过程:----->new的时候,系统做了什么事?
* 1. 开辟空间,存储创建的新的对象
* 2. 把this设置为当前的对象
* 3. 设置属性和方法的值
* 4. 返回当前的新的对象
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
* */
//
// var obj={
// name:"牙擦苏",
// age:20,
// sex:"男",
// height:198,
// weight:55
// };
// var objs={
// "name":"值"
// };
// //遍历对象
// for(var key in obj){
// console.log(key+"======>"+obj[key]);
// }
var obj = {
"name": "牙擦苏",
"age": 20,
"sex": "男",
"height": 198,
"weight": 55
};
var objs = {
"name": "值"
};
//遍历对象
for (var key in obj) {
console.log(key + "======>" + obj[key]);
}
格式化日期时间
目的:自己封装函数按照中国人的方式显示日期时间
console.log(getDate(new Date()));
js部分
/**
* 获取指定的时间
* @param dt 日期的对象
* @returns {string} 返回的是字符串的时间
*/
function getDate(dt) {
//获取年
var year = dt.getFullYear();
//获取月
var month = dt.getMonth() + 1;
//获取日
var day = dt.getDate();
//获取小时
var hour = dt.getHours();
//获取分钟
var minutes = dt.getMinutes();
//获取秒
var seconds = dt.getSeconds();
month = month < 10 ? "0" + month : month;
day = day < 10 ? "0" + day : day;
hour = hour < 10 ? "0" + hour : hour;
minutes = minutes < 10 ? "0" + minutes : minutes;
seconds = seconds < 10 ? "0" + seconds : seconds;
return year + "年" + month + "月" + day + "日 " + hour + ":" + minutes + ":" + seconds;
}
基本包装类型
//基本包装类型
//普通变量不能直接调用属性或者方法
//对象可以直接调用属性和方法
//基本包装类型:本身是基本类型,但是在执行代码的过程中,如果这种类型的变量调用了属性或者是方法,那么这种类型就不再是基本类型了,而是基本包装类型,这个变量也不是普通的变量了,而是基本包装类型对象
//string number boolean
// var str="hello";
// str=str.replace("ll","HH");
// console.log(str);
// var str=new String("hello");
// str=str.replace("ll","HH");
// console.log(str);
// str=null;
// var num=10;//number---->
// console.log(num.toString());
//如果是一个对象&&true,那么结果是true
//如果是一个true&&对象,那么结果是对象
// var flag=new Boolean(false);
// var result=true&&flag;
// console.log(result);
// var num=10;
// var num2=Number("10");//转换,没有new---类型转
// var num3=new Number("10");//基本包装类型
实现系统Max的方法
// 实现系统的Max方法
function myMax() {
// 添加一个方法
this.max = function () {
var max = arguments[0];
for (var i = 0; i < arguments.length; i++) {
if (max < arguments[i]) {
max = arguments[i];
}
}
return max;
};
}
//实例对象
var max = new myMax();
var max1 = max.max(10, 20, 30, 40);
console.log(max1);
字符串的案例
/*var str="我想要截取的字符串";
var key="截取";
//先获取想要截取的字符串索引的位置
index=str.indexOf(key);
//从指定的位置开始截取,截取两个即可
str=str.substr(index,2);
console.log(str);*/
//找到字符串中所有e出现的位置
/*var str="hello oed eye age";
var index=0;
var key="e";
while ((index=str.indexOf(key,index))!==-1){
console.log(index);
index+=key.length;
}*/
//案例3:找到这个字符串中每个字符串出现了多少次
var str = "zhaoyazhAozhaoGezifuChuan";
str = str.toLocaleLowerCase();
var obj = {};
for (var i = 0; i < str.length; i++) {
var key = str[i];
if (obj[key]) {
obj[key]++;
} else {
obj[key] = 1;
}
}
for (key in obj){
console.log(key+"出现了"+obj[key]);
}
/*//案例3:找到这个字符串中每个字符串出现了多少次
var str3 = "whatOareYyouYnoYshaHleiHoHmyHgod";
//第一步:把所有的字母全部变成小写
str3 = str3.toLocaleLowerCase();
//第二步:创建一个空对象,目的:把字母作为键,次数作为值
var obj = {};
//第三步,遍历字符串,获取每个字母
for (var i = 0; i < str3.length; i++) {
//判断obj这个对象中有没有这个字母(字母---键)
var key = str3[i];//每个字母
if (obj[key]) {//判断obj中有没有这个键
//对象中有这个字母了
obj[key]++;
} else {
//对象中没有这个字母,那就把字母加到对象中,并且给这个字母一个出现的次数,默认1次
obj[key] = 1;
}
}
//遍历对象,显示每个字母的次数
for(var key in obj){
console.log(key+"这个字母出现了"+obj[key]+"次");
}*/
/*// /把对象["属性名字"]--->放在if的判断中即可----判断对象中有没有这个属性
var obj={
"sex":"男"
};
if (obj["sex"]){
console.log("有");
} else {
console.log("没有");
}*/
总结Date对象
var dt=new Date();
dt.getFullYear();//年
dt.getMonth();//月-----从0开始
dt.getDate();//日
dt.getDay();//星期----从0开始
dt.toDateString();//日期
dt.toLocaleDateString();//日期
dt.toTimeString();//时间
dt.toLocaleTimeString();//时间
dt.valueOf();//毫秒
/*
// 不支持HTML5的浏览器,可以用下面这种方式
var now = + new Date(); // 调用 Date对象的valueOf()
*/
Array对象的方法
/*
* Array.isArray(对象)---->判断这个对象是不是数组
*.concat(数组,数组,数组,...) 组合一个新的数组
*.every(函数)--返回值是布尔类型,函数作为参数使用,函数中有三个参数,第一个参数是元素的值,第二个参数是索引值,第三个参数是原来的数组(没用) 如果这个数组中的每个元素的值都符合条件,最后才返回的是true
*.filter(函数);返回的是数组中每一个元素都复合条件的元素,组成了一个新的数组
* .push(值);--->把值追加到数组中,加到最后了---返回值也是追加数据之后的数组长度
* .pop();--->删除数组中最后一个元素,返回值就是删除的这个值
* .shift();--->删除数组中第一个元素,返回值就是删除的这个值
* .unshift();--->向数组的第一个元素前面插入一个新的元素,----返回值是插入后的程度
* .forEach(函数)方法---遍历数组用---相当于for循环
* .indexOf(元素值);返回的是索引,没有则是-1
* .join("字符串");----返回的是一个字符串
* .map(函数);--->数组中的每个元素都要执行这个函数,把执行后的结果重新的全部的放在一个新的数组中
* .reverse();----->反转数组
* .sort();---排序的,可能不稳定,如果不稳定,请写MDN中的那个固定的代码
* .arr.slice(开始的索引,结束的索引);把截取的数组的值放在一个新的数组中,但是不包含结束的索引对应的元素值
* .splice(开始的位置,要删除的个数,替换的元素的值);一般是用于删除数组中的元素,或者是替换元素,或者是插入元素
* */
// Array.isArray(对象)---->判断这个对象是不是数组
// var arr=[];
// console.log(arr instanceof Array);
// console.log(Array.isArray(arr));
// .concat(数组,数组,数组,...) 组合一个新的数组
// var arr1=[10,20,30];
// var arr2=[40,50,60];
// var arr3=arr1.concat(arr2);
// console.log(arr3);
// .every(函数)--返回值是布尔类型,函数作为参数使用,函数中有三个参数,第一个参数是元素的值,第二个参数是索引值,第三个参数是原来的数组(没用) 如果这个数组中的每个元素的值都符合条件,最后才返回的是true
// var arr = [10, 20, 30];
// var result = arr.every(function (ele, index) {
// return ele > 10;
// });
// console.log(result);
//.filter(函数);返回的是数组中每一个元素都复合条件的元素,组成了一个新的数组
// var arr = [10, 20, 30, 40];
// var result = arr.filter(function (ele) {
// return ele > 20;
// });
// console.log(result);
// .push(值);--->把值追加到数组中,加到最后了---返回值也是追加数据之后的数组长度
// var arr=[10,20,30];
// arr.push(100);
// console.log(arr);
// .pop();--->删除数组中最后一个元素,返回值就是删除的这个值
// var arr=[10,20,30];
// arr.pop();
// console.log(arr);
// .shift();--->删除数组中第一个元素,返回值就是删除的这个值
// var arr=[10,20,30];
// arr.shift();
// console.log(arr);
// .unshift();--->向数组的第一个元素前面插入一个新的元素,----返回值是插入后的程度
// var arr=[10,20,30];
// arr.unshift(100);
// console.log(arr);
// .forEach(函数)方法---遍历数组用---相当于for循环
// var arr=[10,20,30];
// arr=arr.forEach(function (ele,index) {
// console.log(ele+"------->"+index);
// });
// .indexOf(元素值);返回的是索引,没有则是-1
// var arr=[10,20,30];
// console.log(arr.indexOf(20));
// .join("字符串");----返回的是一个字符串
// var arr=[10,20,30];
// console.log(arr.join("|"));
// .map(函数);--->数组中的每个元素都要执行这个函数,把执行后的结果重新的全部的放在一个新的数组中
// var arr=[10,20,30];
// var newArr=arr.map(Math.sqrt);
// console.log(newArr);
// .reverse();----->反转数组
// var arr=[10,20,30];
// var newArr=arr.reverse();
// console.log(newArr);
//.sort();---排序的,可能不稳定,如果不稳定,请写MDN中的那个固定的代码
// var arr = [10, 1, 2, 3, 500, 43];
// var newArr = arr.sort(function (a, b) {
// if (a > b) {
// return 1;
// } else if (a == b) {
// return 0;
// } else {
// return -1;
// }
// });
// console.log(newArr);
// .arr.slice(开始的索引,结束的索引);把截取的数组的值放在一个新的数组中,但是不包含结束的索引对应的元素值
// var arr=[10,20,30,40,50,60];
// var newArr=arr.slice(2,3);
// console.log(newArr);
// .splice(开始的位置,要删除的个数,替换的元素的值);一般是用于删除数组中的元素,或者是替换元素,或者是插入元素
// var arr=[10,20,30];
// arr.splice(1,0,"你好");
// console.log(arr);
Date对象
//创建实例对象
// //当前时间----当前服务器
// var dt=new Date();
// console.log(dt);
// //自己输入时间
// dt=new Date("2017/1/1");
// console.log(dt);
// //输出从1970年距今毫秒
// dt=Date.now();
// console.log(dt);
var dt = new Date();
// 获取年份
console.log(dt.getFullYear());
// 获取月份
console.log(dt.getMonth()); //是从0开始,真实月份需要加1
// 获取日期
console.log(dt.getDate());
// 获取小时
console.log(dt.getHours());
// 获取分钟
console.log(dt.getMinutes());
// 获取秒
console.log(dt.getSeconds());
// 获取星期
console.log(dt.getDay());//是从0开始,0是星期日
console.log(dt);
//转成字符串
console.log(dt.toString());
console.log(dt.toDateString());//英文的----日期
console.log(dt.toLocaleDateString());//数字格式----日期
console.log(dt.toTimeString());//小时分钟秒
console.log(dt.toLocaleTimeString());//小时分钟秒
String对象
/*
*
* String---->是一个对象
* 字符串可以看成是字符组成的数组,但是js中没有字符类型
* 字符是一个一个的,在别的语言中字符用一对单引号括起来
* 在js中字符串可以使用单引号也可以使用双引号
* 因为字符串可以看成是数组,所以,可以通过for循环进行遍历
*
* 字符串特性:不可变性,字符串的值是不能改变
*
* 字符串的值之所以看起来是改变的,那是因为指向改变了,并不是真的值改变了
*
*
* */
// var str="hello";
// str[1]="W"; 字符串可以通过索引访问字符串中的某个值
// 但是,是可以访问---读取---只读
// 设置:就是可以改变
//对象的方式来看待
// var str="小苏好猥琐";
// str="小苏好邪恶了";//重新赋值
// console.log(str);
// var str="hello";
// str[1]="W";
// console.log(str);
// for(var i=0;i<str.length;i++){
// console.log(str[i]);
// }
// var str="1";
// str="2";
// str="3";
var str="123";
str="456";
console.log(str);
//String对象
// string ---->字符串类型----基本类型
// String---->字
//
// 符串类型----引用类型
//字符串对象----String对象
// var str1="90";
// var str2="哈哈,我又变帅了";
// var str3="안녕하세요.";
// var str4="こんにちは";
// var str5="สวัสดี";
// var str6="Привет ";
var str="萨瓦迪卡";
//js中没有字符类型
//字符类型
//字符串类型
/*
* 整数类型
* int num=10;
* 小数
* float num2=90.4
* 字符串
* string str="hello"; //字符串必须用双引号
* //字符
* char ch='h'; //字符必须用单引号---值---只有一个
*
* char ch='y'
*
* 'h'+'e'+'l'+'l'+'o'---- "hello"
*
* //字符串是可以看成是多个字符组合成的数组的
*
* js中无论是单引号的还是双引号的都是字符串
*
*
* */
// var str="hello";//可以看成是一个字符数组
// for(var i=0;i<str.length;i++){
// console.log(str[i]);
// }
String对象的方法
/*
*
* 实例方法---->必须要通过new的方式创建的对象(实例对象)来调用的方法
* 静态方法---->直接通过大写的构造函数的名字调用的方法(直接通过大写的对象名字调用的)
*
* */
/*
*
* 字符串的常用属性:
* .length------>字符串的长度
* .charAt(索引),返回值是指定索引位置的字符串,超出索引,结果是空字符串
* .fromCharCode(数字值,可以是多个参数),返回的是ASCII码对应的值
* .concat(字符串1,字符串2,...);返回的是拼接之后的新的字符串
* .indexOf(要找的字符串,从某个位置开始的索引);返回的是这个字符串的索引值,没找到则返回-1
* .lastIndexOf(要找的字符串);从后向前找,但是索引仍然是从左向右的方式,找不到则返回-1
* .replace("原来的字符串","新的字符串");用来替换字符串的
* .slice(开始的索引,结束的索引); 从索引5的位置开始提取,到索引为10的前一个结束,没有10,并返回这个提取后的字符串
* .split("要干掉的字符串",切割后留下的个数);切割字符串
* .substr(开始的位置,个数);返回的是截取后的新的字符串
* .substring(开始的索引,结束的索引),返回截取后的字符串,不包含结束的索引的字符串
* .toLocaleLowerCase();转小写
* .toLowerCase();转小写
* .toLocaleUpperCase()转大写
* .toUpperCase();转大写
* .trim();干掉字符串两端的空格
*
*/
// .length------>字符串的长度
var str = "12345";
console.log(str.length);
// .charAt(索引),返回值是指定索引位置的字符串,超出索引,结果是空字符串 通过下标
// 字符串中第一个字符的下标是 0。如果参数 index 不在 0 与 string.length 之间,该方法将返回一个空字符串。
results = str.charAt(0);
console.log(results);
// .fromCharCode(数字值,可以是多个参数),返回的是ASCII码对应的值
results = String.fromCharCode(103);
console.log(results);
// .concat(字符串1,字符串2,...);返回的是拼接之后的新的字符串
results = str.concat("上山打老虎");
console.log(results);
// .indexOf(要找的字符串,从某个位置开始的索引);返回的是这个字符串的索引值,没找到则返回-1
index = str.indexOf("3", 0);
console.log(index);
// .lastIndexOf(要找的字符串);从后向前找,但是索引仍然是从左向右的方式,找不到则返回-1
lastindex = str.lastIndexOf("5");
console.log(lastindex);
// .replace("原来的字符串","新的字符串");用来替换字符串的
if (str.indexOf("12345") === !-1) {
var replace = str.replace("12345", "54321");
console.log(replace);
} else {
console.log("没有找到");
}
// .slice(开始的索引,结束的索引); 从索引5的位置开始提取,到索引为10的前一个结束,没有10,并返回这个提取后的字符串 也就是提取
str = "这是一个要被提取的字符串";
str = str.slice(5, 8);
console.log(str);
// .split("要干掉的字符串",切割后留下的个数);切割字符串
str = "小明|小红|小军|小王";
str = str.split("|");
console.log(str);
// .substr(开始的位置,个数);返回的是截取后的新的字符串
str = "哈哈,小苏真的是好帅哦";
str = str.substr(5, 5);
console.log(str);
// .substring(开始的索引,结束的索引),返回截取后的字符串,不包含结束的索引的字符串
str = "哈哈,小苏真的是好帅哦";
str = str.substring(5, 9);
console.log(str);
// .toLocaleLowerCase();转小写
str = "HELLO";
str = str.toLocaleLowerCase();
console.log(str);
// .toLowerCase();转小写
str = "HELLO";
str = str.toLowerCase();
console.log(str);
// .toLocaleUpperCase()转大写
str = "hello";
str = str.toLocaleUpperCase();
console.log(str);
// .toUpperCase();转大写
str = "hello";
str = str.toUpperCase();
console.log(str);
// .trim();干掉字符串两端的空格
str = " 你好 ";
str = str.trim();
console.log(str);
js复习
01复习
/*
*
* 复习:
* JavaScript简称为JS
* JavaScript是什么?
* 是一门脚本语言:不需要编译,直接运行
* 是一门解释性的语言:遇到一样代码就解释一行代码
* C#语言是一门面向对象的语言,也是编译语言,是.net技术使用的
* 是一门动态类型的语言---不解析
* 是一门基于对象的语言---不解释
* 是一门弱类型的语言,声明变量的时候都使用var
* 强类型的语言:C#就是----->
* 存储一个数字: int num=10; float num2=90.3;
*
* JS分三个部分:
* 1. ECMAScript标准: js的基本的语法
* 2. DOM
* 3. BOM
*
* JS用了将近10天来发明的
*
* 变量---作用:操作数据(存储数据,读取数据)
* 变量的声明:
* var 变量名字;
* var num;
* 变量的初始化
* var 变量名字=值;---->字面量的方式赋值
* var str="您好啊";
* js中大小写是区分的
* js中的字符串可以使用单引号,也可以使用双引号---暂时推荐使用双引号
* js中每行代码结束要有分号 ;
* 数据类型:
* js中的原始数据类型: number,string,boolean,undefined,null,object
* null和undefined数据是没有太大意义的,null是很有意义的---对象的位置讲
* NaN----不是一个数字,不是一个数字和一个数字计算--->结果就是NaN
* isNaN()--->判断这个变量或者这个值是不是 不是一个数字---如果不是一个数字结果是true,如果是一个数字结果false
*
* number数据类型----无论是整数还是小数都是number数据类型的
* string数据类型----字符串,获取字符串的长度:变量名.length
* boolean数据类型---两个值,true,false
* null----只有一个,null
* undefined----只有一个,undefined,一个变量声明了,没有赋值
* object---对象-----面向对象的时候讲解
*
* 类型转换:
* 其他类型转数字
* parseInt()---->转整数
* parseFloat()--->转小数
* Number()---->转数字-----要比上面两个严格
* 其他类型转字符串
* .toString()
* String();
*
* 其他类型转布尔类型
* Boolean()---->要么是true要么是false
*
* 运算符:----操作符
* 算术运算符: + - * / %
* 复合运算符: += -= *= /= %=
* 赋值运算符: = 优先级别是最低的
* 一元运算符: ++ --
* 三元运算符: ? :
* 关系运算符: > < >= <= == === != !==
* 逻辑运算符: && || !
*
* 关系运算符的结果是布尔类型
* 逻辑运算符的结果是布尔类型
*
* 表达式1&&表达式2
* 如果有一个为false,整个结果就是false
* 表达式1||表达式2
* 只有有一个为true,整个结果为true
* !表达式---结果就是取反
*
* 案例: 交换两个变量的值
*
*
*
*
* */
//如果有一个是字母字符串,另一个不是字符串是数字,用 - 或者* 结果是什么? 为什么要获取变量的数据类型? 为什么要有数据类型?
// var ch="a";
// var num=10;
// console.log(ch*num);
//
// console.log(num);
// //转布尔类型的时候是遵循1是true,0是false 的原则吗 ?
// console.log(Boolean(1));//true
// console.log(Boolean(0));//false
// console.log(Boolean(11));//true
// console.log(Boolean(-10));//true
// console.log(Boolean("哈哈"));//true
// console.log(Boolean(""));//false
// console.log(Boolean(null));//false
// console.log(Boolean(undefined));//false
02复习
/*
*
* 一元运算符: ++ --
*
* 如果不参与运算, ++在前面还是在后面结果都是一样的 +1
* 如果不参与运算, --在前面还是在后面结果都是一样的 -1
*
* var num=10;
* num++; 后+
* ++num; 前+
* 无论是前+还是后+只要参与运算,结果可能就不太一样
* 如:
* var num=10;
* var sum= num++ +10;
* ++在后面的时候,先参与运算,然后自身加1
* var num=10;
* var sum=++num +10;
* ++在前面的时候,先自身加1,然后再参与运算
*
* 流程控制: 代码的执行过程
* 1. 顺序结构:代码的执行的顺序,从上到下,从左到右(不严谨)
* 2. 分支结构: if,if-else ,if-esle if,switch-case ,三元表达式
* 3. 循环结构:while 循环,do-while,for循环 for-in循环
*
* 总结分支:如果只有一个分支,就用if
* 如果有两个分支,就用if-else
* 如果多个分支,一般是范围的,推荐使用if-else if
* 如果多个分支,一般是具体的值,推荐使用switch-case
*
*
*
*
* 总结循环:
* while:先判断后循环,有可能一次循环都不执行
* do-while:至少执行一次循环体,再判断
* for循环:知道了循环的次数,推荐使用for循环
*
*
* 调试:是为了找代码的错误和问题所在,
* 断点,不加断点,就不方便调试
*
*
*
* */
03复习
/*
*
* break:在循环中遇到这个关键字,直接跳出当前所在的循环
* continue:在循环中遇到这个关键字,直接进行下一次循环
* 数组:存储一组有序的数据,数据类型可以不一样
* 数组的作用:一次性存储多个数据
* 数组元素:数组中存储的每个数据,叫数组元素,存储了5个数据,有5个数组元素
* 数组的长度:数组的元素的个数,叫数组的长度:数组名.length--->就是长度,数组的长度是可以改变的
* 索引(下标):存储数组元素的编号,从0开始,到数组的长度-1结束
* 索引是用来存储和读取数组元素的
* 遍历数组:通过循环的方式找到数组中的每个数据
* 冒泡排序:
* 求数组的和,最大值,最小值,平均值
*
* 数组定义的方式:
* 1. 通过构造函数定义数组
* var 数组名=new Array();空数组 Array()就是构造函数
* var 数组名=new Array(长度);是设置数组的初始的长度,长度是可以改变的
* var 数组名=new Array(值,值,值...);定义数组并设置数组中的元素值
* 2. 字面量的方式定义数组
* var 数组名=[];空数组
* var 数组名=[10];这个数组有一个元素,值是10,长度是1
* 数组变量
* for(var i=0;i<数组名.length;i++){
*
* }
*
*
* 函数:把一些重复的代码封装起来,在需要的时候直接调用这个函数就可以了
* 函数作用:代码的重用
* 函数定义:
* function 函数名(){
* 函数体
* }
* 函数调用:
* 函数名();
*
* 参数:形参和实参
* 形参:函数定义的时候函数名字后面的小括号里的变量就是参数,是不需要写var
* 实参:函数调用的时候小括号里传入的变量或者是值,都是实参
* 返回值:函数中如果有return,那么这个函数就有返回值
* 如果函数中没有return,那么这个函数没有返回值
* 如果函数中有return,但是后面什么内容都没有,这个函数没有明确返回值
* 如果一个函数没有明确的返回值,函数调用了,并且接收了,那么此时接收的结果undefined
* 如果直接输出函数名字,那么是这个函数的代码
* 无参数无返回值的函数
* function f1(){
*
* }
* 有参数无返回值的函数,2个参数
* function f2(x,y){
*
* }
* 无参数有返回值的函数
* function f3(){
* return 100;
* }
* 有参数有返回值的函数
* function f4(x){
* return "您好";
* }
*
*
*
*
* */
var arr = [1, 5, 10, 3, 100, 20];
//循环控制比较的轮数
for (var i = 0; i < arr.length - 1; i++) {
//此时只是比较了一次---如果想要比较多次--for循环
for (var j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] < arr[j + 1]) {
var temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
console.log(arr);
</script>
<script>
// //隐式全局变量
// for( i=0;i<10;i++){
// console.log("今天天气真好");
// }
</script>
04复习
// var str = prompt("请输入一个数字");
// //用户没有输入内容
// if (str == "") {
// console.log("您输入有误");
// } else {
// //用户输入内容了
// if (!isNaN(parseInt(str))) {
// console.log("用户输入的是一个数字");
// //调用一个函数,把这个数字传入到函数中,判断该数字是不是质数
// } else {
// console.log("用户输入的不是一个数字");
// }
// }
</script>
<script>
//如何判断一个数字是质数
// var num=7;
// function isPrimeNumber(num) {
// for(var i=2;i<=num/2;i++){
// if(num%i==0){
// return false;
// }
// }
// return true;
// }
// console.log(isPrimeNumber(num));
</script>
<script>
/*
*
*
*
*
*
*
*
* */
</script>
<script>
/*
* 复习:
* 函数:把一些重复的代码封装在一个地方,在需要的时候直接调用这个地方的代码就可以了
*
* 函数作用:代码重用
*
* 函数的参数:
* 1.形参:函数定义的时候,函数名字后面的小括号里的变量
* 2.实参:函数调用的时候,函数名字后面的小括号里的变量或者值
*
* 返回值:
* 函数中有return,函数有返回值
* 函数中没有return,函数没有返回值
* 没有明确返回值:函数中没有return或者return后面没有任何内容
* 如果一个函数没有明确的返回值,接收这个函数,结果是undefined
*
* 无参数无返回值的函数
* 无参数有返回值的函数
* 有参数无返回值的函数
* 有参数有返回值的函数
*
* arguments----->可以获取函数调用的时候,传入的实参的个数
* arguments是一个对象,是一个伪数组
* arguments.length--->是实参的个数
* arguments[索引]---->实参的值
*
* 作用域:变量的使用范围
* 全局作用域:全局变量在任何位置都可以使用的范围
* 局部作用域:局部变量只能在某个地方使用---函数内
* 作用域链:在一个函数中使用一个变量,先在该函数中搜索这个变量,找到了则使用,找不到则继续向外面找这个变量,找到则使用,一直找到全局作用域,找不到则是undefined
* 全局变量:只要是在函数外面声明的变量都可以看成或者是理解成是全局变量
* 局部变量:在函数中定义的变量
*
* 预解析:在执行代码之前做的事情
* 变量的声明和函数的声明被提前了,变量和函数的声明会提升到当前所在的作用域的最上面
* 函数中的变量声明,会提升到该函数的作用域的最上面(里面)
* 如果有多对的script标签都有相同名字的函数,预解析的时候是分段的,互不影响
*
*
*
*
*
*
* */
05复习
/*
* 复习
* 编程思想:
* 面向过程:凡事亲力亲为,所有的事情的过程都要清楚,注重的是过程
* 面向对象:提出需求,找到对象,对象解决这个问题,我们要结果,注重的是结果
*
* 面向对象的特性:封装,继承,多态,(抽象性)
*
* JS是一门什么样的语言?
* 是一门解释性的语言
* 是一门脚本语言
* 是一门弱类型的语言
* 是一门基于对象的语言
* 是一门动态类型的语言
*
* 对象:有属性和方法,具体特指的某个事物
* 对象:js中就是一组无序的属性的集合
* 属性----特征
* 方法----行为
* 创建的对象的方式:
* 1.通过调用系统的构造函数创建对象 new Object()
* var obj1=new Object();
* 2.自定义构造函数创建对象
* var obj2=new 自定义构造函数();
* 3.字面量的方式创建对象
* var obj3={};
* 变量 instanceof 对象------->布尔类型,判断这个变量是不是这个类型的
*
* JSON格式的数据,都是键值对,成对的数据
* var obj={
* name:"小明"
* };
* var json={
* "name":"小明"
* };
*
* json的数据实际上就是格式化后的一组字符串的数据
*
* 对象设置属性的值的写法
* 对象.属性名字=值;----点语法
* 对象["属性的名字"]=值;-----
*
* 对象获取属性的值的写法
* 对象.属性
* 对象["属性"]
*
* 遍历对象
* for(var key in 对象){ key---是一个变量,这个变量中存储的是遍历的对象的属性的名字
*
* }
*
*
* 原始数据类型:number,string,boolean,null,undefined,object
* 基本类型(简单类型,值类型):number,string,boolean
* 复杂类型(引用类型):object
* 空类型:undefined,null
*
* 基本类型的值在栈上
* 复杂类型的对象在堆上,地址(引用)在栈上
*
* 值类型之间传递的是值
* 引用类型之间传递的是引用(地址)
*
*
* 对象分三种:内置对象,自定义对象,浏览器对象
* 内置对象:系统提供的
* 自定义对象:自己写的
* 浏览器对象:浏览器的
*
* Math 是一个对象,但是不是一个函数
* Math对象下的属性和方法都是静态
*
* 方法:
* Math.ceil()---向上取整
* Math.floor()---向下取整
* Math.Pi----圆周率的值
* Math.Max()---一组数字中的最大值
* Math.Min()---一组数字中的最小值
* Math.abs()----绝对值
* Math.random---随机数字
* Math.sqrt()----开平方
* Math.pow()----一个数字的多少次幂
*
*
*
*
* new 的执行过程:----->new的时候,系统做了什么事?
* 1. 开辟空间,存储创建的新的对象
* 2. 把this设置为当前的对象
* 3. 设置属性和方法的值
* 4. 返回当前的新的对象
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
* */
//
// var obj={
// name:"牙擦苏",
// age:20,
// sex:"男",
// height:198,
// weight:55
// };
// var objs={
// "name":"值"
// };
// //遍历对象
// for(var key in obj){
// console.log(key+"======>"+obj[key]);
// }
var obj = {
"name": "牙擦苏",
"age": 20,
"sex": "男",
"height": 198,
"weight": 55
};
var objs = {
"name": "值"
};
//遍历对象
for (var key in obj) {
console.log(key + "======>" + obj[key]);
}
总结数组知识
/*
*
* 数组:存储一组有序的数据
* 数组的作用:一次性存储多个数据
* 数组的定义方式:
* 1.构造函数定义数组: var 数组名=new Array();
* 2.字面量方式定义数组: var 数组名=[];
*
* var 数组名=new Array();空数组
* var 数组名=new Array(值);数组定义了,有长度
* var 数组名=new Array(值1,值2,值3....);定义数组并且有多个数据
* var 数组名=[];空数组
* var 数组名=[值1,值2,值3];有三个数据
* 数组元素:就是数组中存储的数据
* 数组长度:就是数组中元素的个数
* 数组索引(下标):从0开始,到数组的长度减1结束
* 通过下标设置数组的元素值: 数组名[索引]=值
* 通过下标访问数组的元素值: 数组名[索引]
*
*
*
*
* */
var arr1=new Array();//空数组
var arr2=new Array(5);//长度为5的数组,每个数据的值是undefined
var arr3=new Array(1,2,3,4,5);//长度为5分数组,
var arr4=[];//空数组
var arr5=[1,2,3];//长度为3的数组
var arr6=["red","blue","green",1,true];//数组中元素的值的类型可以不一样
var arr7=[];
//设置数组的元素的值
arr7[0]=10;
arr7[1]=20;
总结分支语句
/*
*
* 分支语句:
* if语句:一个分支
* if-else语句:两个分支,最终只执行一个分支
* if-else if-else if...语句: 多个分支,也是只会执行一个
* switch-case语句:多分支语句,最终也会一个(必须要有break)
* 三元表达式:和if-else语句是一样的
* 什么时候使用if-else if...: 一般是对范围的判断
* 什么时候使用switch-case语句:一般是对具体的值的判断
* 如果有多个分支,是针对范围的判断一般选择if-else if的语句
* 如果有多个分支,是针对具体的值判断,一般选择用switch-case语句
*
*
*
*
* */
简单类型和复杂类型
//原始数据类型: number,string,boolean,undefined, null,object
//基本类型(简单类型),值类型: number,string,boolean
//复杂类型(引用类型):object
//空类型:undefined,null
//值类型的值在哪一块空间中存储? 栈中存储
//引用类型的值在哪一块空间中存储?对象在堆上存储,地址在栈上存储
//var num=10;//值类型,值在栈上
//var obj={};//复杂类型,对象在堆,地址(引用)在栈
//值类型之间传递,传递的是值
//引用类型之间传递,传递的是地址(引用)
//值类型作为函数的参数,传递的是值
//引用类型作为函数的参数,传递的是地址
// var num=10;
// var num2=num;//传递的值
// function f1(x) {
// x=100;
// }
// var num=10;
// f1(num);
// console.log(num);//
var obj={
name:"小明"
};
function f2(obj2) {
obj2.name="小红";
}
console.log(obj.name);//
f2(obj);
console.log(obj.name);//
总结while循环和do-while循环
/*
*
* while循环特点:先判断,后循环,有可能一次循环体都不执行
*
* do-while循环特点:先循环,后判断,至少执行一次循环体
*
*
* for循环:
*
* 总结
*
*
* */
调试
//调试:调试代码---高级程序员都是从调试开始的
//调试:写代码---打开浏览器--F12(开发人员工具)--->Sources---双击文件,在某一行代码前面点击一下(出现的东西就是断点)
var sum=0;
for(var i=0;i<5;i++){
sum+=i;//观察一下这个变量的值是多少,或者这行代码执行后的效果如何
}
console.log(sum);
json格式数据
//对象:有属性和方法,特指的某个事物
//对象:一组无序属性的集合的键值对,属性的值可以是任意的类型
// function Dog(name) {
// this.name=name;
// }
// function Person(name,age) {
// this.age=age;
// this.name=name;
// this.sex=true;
// this.dog={};
// this.play=function () {
// console.log("喜欢玩游戏");
// };
// }
//
// var sex=false;//男
// console.log(sex?"男":"女");
//JSON格式的数据:一般都是成对的,是键值对,
//json也是一个对象,数据都是成对的,一般json格式的数据无论是键还是值都是用双引号括起来的
// var obj={
// name:"小明"
// };
/*var json = {
"name": "小明",
"age": "10",
"sex": "男"
};*/
//遍历对象,是不能通过for循环遍历,无序
//key是一个变量,这个变量中存储的是该对象的所有的属性的名字
/* for (var key in json) {
console.log(key + "===========" + json[key]);
}*/
// var key="name";
// console.log(json[key]);
//可以通过for-in循环
//
// for(var key in json){
// //console.log(key);//json对象中的属性的名字
// console.log(json[key]);
// }
//对象中确实有这个属性对象.属性名字 或者对象[属性名字]
//一个一个的遍历出来
// var arr=[10,20,30];
// for(var i=0;i<arr.length;i++){
// console.log(arr[i]);
// }
//json数据练习
var json= {
"name": "小军",
"sex": "男",
"age": "16",
"eat": function () {
console.log("会吃饭");
}
};
for(var i in json){
console.log(i+"---------"+json[i]);
}
js初学总结的更多相关文章
- Node.js初学
Node.js 初学~ 其技术上最大的卖点是非阻塞的I/O和基于事件的异步处理机制. 后端没有什么深入研究,一直对其不是很了解. 透过一个例子看 非阻塞 与 通常的 阻塞 var text = rea ...
- node.js 初学(二)—— 搭建注册/登录服务器
node.js 初学(二)—— 搭建注册/登录服务器 理论上来说,代码实现在理论和实际上是一样的.但实际上来说,他们不是 做一个最简单的用户注册登录功能 1.接口定义: 注册:/user?act=re ...
- node.js 初学(一)—— http fs 服务器/文件/post get
node.js 初学 —— http fs 服务器/文件/post get 这个世界,从来不会给失败者颁奖! 了解 node.js (开源) node.js 是用来做后台开发的,但是现在大部分前端人员 ...
- JS初学之-选项卡(图片切换类)
初学选项卡,主要问题卡在了索引值上面,花了较长的时间学习. 索引值其实很好理解,就是为每一个元素用JS的方法添加一个属性,即自定义属性. 在for循环里的函数里用i,会直接弹出这个数组的length, ...
- JS初学之-if else图片顺序及循环切换
初学JS,代码还需多多改进,自学中... <!doctype html><html><head><meta charset="utf-8" ...
- node.js初学遇到的问题
是用express安装一个网站基础架构时 express -t ejs microblog 但是出来的模板引擎是jade,通过修改js也修改模板引用npm install 等等修改了index.ejs ...
- JS初学之-效果没出来怎么办?-alert函数测试
一般出了问题之后,有经验的高手一眼就可以看出来,但是对于我们初学者来说,利用alert函数不失为一个好方法. 这时我们要利用逐行测试的方法,在任意一句代码下加alert,如果可以弹出来就说明上面的没有 ...
- 使用express搭建第一个Web应用【Node.js初学】
来源:http://jingyan.baidu.com/article/bad08e1ee501e009c8512106.html express是一个开源的node.js项目框架,初学者使用expr ...
- JS初学的一些易错的知识点
1. false ,0 , "" ,undefined , null 在Boolean 环境下当成 false: null 在数值环境下当成 0: undefined 在数值 ...
- js初学必知三重点
这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...
随机推荐
- Liunx学习总结(一)--初识 Liunx
liunx 系统可以说是目前为止份额最大的一个系统了,基本上大多数服务器上都可以看到它的身影.今天我们就来学习一下它. Liunx 简介 Linux 是一套免费使用和自由传播的类 Unix 操作系统, ...
- C#数据结构_图
顶点的度=顶点的入度+顶点的出度. 顶点 v 的入度是指以该顶点 v 为弧头的弧的数目:顶点 v 的出度是指以该顶点 v 为弧尾的弧的数目. 简单路径:一条路径上顶点不重复出现. 回路:第一个顶点和最 ...
- helm部署Redis哨兵集群
介绍 Redis Sentinel集群是由若干Sentinel节点组成的分布式集群,可以实现故障发现.故障自动转移.配置中心和客户端通知. 如下图: Redis Sentinel 故障转移过程: 从这 ...
- UML类图详解和示例
ps:博客园markdown不能自动生成列表,更好的阅读体验可访问我的个人博客http://www.isspark.com/archives/UMLDescription UML类图概述 什么是UML ...
- Oracle - 获取当前周别函数
CREATE OR REPLACE FUNCTION GET_WEEK (V_RQ in DATE) return varchar2 as str varchar2(); str1 varchar2( ...
- Win10下安装python3.x+pycharm+autopep8
一.安装Python3.X 1.Pythong官方网站:http://python.org/getit/ 下载windows的安装包.有以下几个选项: 这里选择windows x86-64 exc ...
- CF1028D Order book 思维
Order book time limit per test 2 seconds memory limit per test 256 megabytes input standard input ou ...
- hdu6376 度度熊剪纸条 思维
度度熊剪纸条 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- hdu2082 找单词 母函数模板
找单词 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 网页去重之Simhash算法
Simhash算法是Google应用在网页去重中的一个常用算法,在开始讲解Simhash之前,先了解——什么是网页去重?为什么要进行网页去重?如何进行网页去重,其基本框架是什么? 网页去重,顾名思 ...