基本语法注意点

数据对比

不要使用==比较,始终坚持使用 === 比较。 == 会自动转换数据类型来对比,有时候会得到奇怪的结果(当对比数据类型不同时) === 会先判断数据类型是否一致(不一致返回false),再对比数据是否相同。

false == 0; // 返回 true
false === 0; // 返回 false

特例:

NaN === NaN; //返回false

必须用 isNaN(Nan) 来判断

字符串相关

格式化多行字符串

var name = '小明';
var age = 20;
var message = `你好, ${name}, 你今年${age}岁了!`;

字符串是不可变的 使用以下方法,都无法改变字符串

var s = 'Hello, world!';
s[0] = 'X'; //还是 Hello world
s.toUpperCase() //返回大写的字符串,但 s 不变

数组相关

直接给Array的length赋一个新的值会导致Array大小的变化

var arr = [1, 2, 3];
arr.length = 6; //arr变为[1, 2, 3, undefined, undefined, undefined]

如果通过索引赋值时,索引超过了范围,同样会引起Array大小的变化:

var arr = [1, 2, 3];
arr[5] = 'x';	// arr变为[1, 2, 3, undefined, undefined, 'x']

对象相关

  • 简单示例:
var xiaoming = {
    name: '小明',
    birth: 1990,
    school: 'No.1 Middle School',
    height: 1.70,
    weight: 65,
    score: null
};
  • 判断对象是否有某个属性的方法
  1. 'name' in xiaoming; // true
  2. xiaoming.hasOwnProperty('name'); //只针对 该属性属于该类,忽略父类
  • 条件判断
var s = ‘’123
If (s.length) 

JavaScript把null、undefined、0、NaN和空字符串’‘视为false,其他值一概视为true,因此上述代码条件判断的结果是true。

容器相关

  • 循环
//对象key循环遍历
var o = {
    name: 'Jack',
    age: 20,
    city: 'Beijing'
};
for (var key in o) {
    console.log(key); // 'name', 'age', 'city'
}
//数组遍历, 遍历的是数组的序号(是字符串而不是数字类型)
var a = ['A', 'B', 'C'];
for (var i in a) {
    console.log(i); // '0', '1', '2' 
}
//遍历元素,用of
For (var item of a) {
console.log(i); // ‘A’, ‘B’, ‘C’ 
}
  • for … of循环和for … in循环有何区别

Array实际上也是个对象,元素下标就是它的key。

var a = ['A', 'B', 'C'];
a.name = ‘D‘
for (var x in a) {
    console.log(x); // '0', '1', '2', 'name'
}

因此用 of 来遍历,就不会有上面的问题

for (var x of a) {
    console.log(x); // 'A', 'B', 'C' 不会有 ‘D’
}
//forEach 遍历方法
ar.forEach(function (e, i, ar) { //e 是元素,i是序号,ar 是原数组
            console.log(`element=${e} index=${i}`)
 })

局部作用域

由于JavaScript的变量作用域实际上是函数内部,在函数代码块中声明的变量,在函数体内都是可以用的

function foo() {
    {
	var i = 1
    }
    i += 100; // 仍然可以引用变量i
}
  • 使用let 即可申请一个块级作用域的变量
function foo() {
    {
	let i = 1
    }
    i += 100; // 会报错,无该变量
}

PS:常量声明 const 也有块级作用域功能

快速结构赋值

  • 从数组里赋值
var [x,y,z] = [‘a’, ‘b’, ‘c’]
var [x, [y, z]] = [‘a’, [1,2]]
var [,y,z] = [1,2,3]
  • 从对象结构里赋值
var person = {
    name: '小明',
    age: 20,
    address: {
        city: 'Beijing',
        street: 'No.1 Road',
        zipcode: '100001'
    }
};
var {name, address: {city, zip=‘55’}} = person;

name //小明 city //Beijing zip //应该无值的,但有默认值 ’55‘

var {name: realName} = person;

name //undefined realName //小明

  • 已经声明的变量 再从对象里赋值
var name, address;
{name, address} = person; //执行会报错
({name, address} = person; ) //用小括号包起来即可