1.Js基础语法
1.数据类型
JavaScript不区分整数和浮点数,统一用Number表示
NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示 Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
2.比较运算符
要特别注意相等运算符==。JavaScript在设计时,有两种比较运算符:
第一种是==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;
第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。
由于JavaScript这个设计缺陷,不要使用==比较,始终坚持使用===比较。
另一个例外是NaN这个特殊的Number与所有其他值都不相等,包括它自己:
NaN === NaN; // false
唯一能判断NaN的方法是通过isNaN()函数:
isNaN(NaN); // true
最后要注意浮点数的相等比较:
1 / 3 === (1 - 2 / 3); // false
这不是JavaScript的设计缺陷。浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
null和undefined
null表示一个“空”的值,它和0以及空字符串''不同,0是一个数值,''表示长度为0的字符串,而null表示“空”。
在其他语言中,也有类似JavaScript的null的表示,例如Java也用null,Swift用nil,Python用None表示。但是,在JavaScript中,还有一个和null类似的undefined,它表示“未定义”。
JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。
3.数组
3.1声明数组:
数组用[]表示,元素之间用,分隔。
或者:new Array(1, 2, 3, "hello");
3.2改变数组长度:
var arr = [1, 2, 3];
arr.length;//这时候长度是3
arr.legth = 7;//这时长度变为7,其中后面4个为未定义的;
3.3数组的常用方法:
indexOf();//查找数组中元素的下标
slice();//用下标值截取数组中的参数返回新数组,不输入参数返回所有
push();//在Array后添加若干个变量
pop();//删除数组的最后一个元素
unshift();//在数组最前面添加元素
shift();//删除数组最前面的一个元素
sort()://排序数组
reverse();//反转数组顺序
splice(0, 1, "good", "food");//按照下标值增删改元素(只输下标值为删除)
concat();//合并数组,类似“+”号使用
join("*");使用指定符号链接数组元素
4.对象
4.1JavaScript的对象是一组由键-值组成的无序集合,例如:
var person = { name: 'Bob', age: 20, tags: ['js', 'web', 'mobile'], city: 'Beijing', hasCar: true, zipcode: null };
JavaScript对象的键都是字符串类型,值可以是任意数据类型。上述person对象一共定义了6个键值对,其中每个键又称为对象的属性,例如,person的name属性为'Bob',zipcode属性为null。
要获取一个对象的属性,我们用对象变量.属性名的方式:
person.name; // 'Bob' person.zipcode; // null
4.2in操作符
"name" in person;//判断name是否存在于person中true
person.hasOwnProperty("name");//判断name属性是否为自身拥有(非继承)true
5.变量
js是动态语言,可以兼容多种类型:
var a = 10.0;
a = "你好";
6.strict模式(全局变量声明)
不声明变量类型,则为全局变量,如:
i = 15;
在代码的第一行声明"use strict"则进入严格模式,严格模式下禁止不声明变量类型而直接使用;
7.拼接字符串:
1.一般情况下使用”+“标示即可
2.字符太多可使用ES6模板字符串方式:
例子:
var name = '小明'; var age = 20; var message = `你好, ${name}, 你今年${age}岁了!`; alert(message);
8.字符串的常用方法;
8.1获取字符串长度:
var s = 'Hello, world!'; s.length; // 13
8.2使用数组下标(索引)取值:
var s = 'Hello, world!'; s[0]; // 'H' s[6]; // ' ' s[7]; // 'w' s[12]; // '!' s[13]; // undefined 超出范围的索引不会报错,但一律返回undefined
注意:使用字符串索引方式赋值是不允许的;续上:
s[7] = "q";//内容还是w,不发生变化; 8.3JavaScript为字符串提供了一些常用方法,注意,调用这些方法本身不会改变原有字符串的内容,而是返回一个新字符串:
toUpperCase
toUpperCase()把一个字符串全部变为大写:
var s = 'Hello'; s.toUpperCase(); // 返回'HELLO'
toLowerCase
toLowerCase()把一个字符串全部变为小写:
var s = 'Hello'; var lower = s.toLowerCase(); // 返回'hello'并赋值给变量lower lower; // 'hello'
indexOf
indexOf()会搜索指定字符串出现的位置:
var s = 'hello, world'; s.indexOf('world'); // 返回7 s.indexOf('World'); // 没有找到指定的子串,返回-1
substring
substring()返回指定索引区间的子串:
var s = 'hello, world' s.substring(0, 5); // 从索引0开始到5(不包括5),返回'hello' s.substring(7); // 从索引7开始到结束,返回'world'
9.for...in...遍历数组(类似java增强的for循环)
var o = { name: 'Jack', age: 20, city: 'Beijing' }; for (var key in o) { alert(key); // 'name', 'age', 'city' }
10.数据结构Map和set(都无法使用下标遍历)
数据结构set不许重复key
10.1Map的方法:
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
m.set("dog",88);//增加元素 m.get('dog'); // 88
10.2Set的方法:
"use strict"
var m = new Set([1,2,3]);
m.add(5);
m.delete(1);//删除1这个元素
10.3Map和Set的遍历
使用for...of...遍历
Set:var m = new Set([1,2,3]);
for (var k of m) {
alert(k);
}
Map:var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
m.set("dog",88);//增加元素 m.get('dog'); // 88
for (var k of m) {
alert(k);
}
10.4for...in...和for...of...的区别
var a = ['A', 'B', 'C']; a.name = 'Hello'; for (var x in a) { alert(x); // '0', '1', '2', 'name' }
var a = ['A', 'B', 'C']; a.name = 'Hello'; for (var x of a) { alert(x); // 'A', 'B', 'C' }