一、语法
- 严格模式:在脚本或函数体的开头加上
"use strice"
- 在函数内定义变量时省略 var 操作符,可以创建一个全局变量
message = 'hi'//全局变量
二、变量
var 和 let 的区别
var | let |
---|---|
声明的关键词变量会自动提升到函数作用域的顶部,即先输出再定义不会报错,因为把所有声明都提升到了顶部先执行 | 变量不会在作用域中被提升 |
声明的范围是函数作用域 | 声明的范围是块作用域(也就是一个大括号内) |
允许同一个块内出现冗余声明 | 不允许同一个块内出现冗余声明 |
在全局作用域中声明的变量会成为 window 对象的属性(window.name) | 在全局作用域中声明的变量不会成为 window 对象的属性 |
迭代变量保存的是导致循环退出的值 | 会为每个迭代变量声明一个新的迭代变量 |
- 总的来说这两个关键字声明的并不是不同类型的变量,它们只是指出变量在相关作用域如何存在
- const 的行为与 let 基本相同,唯一一个重要的区别是用它声明变量时必须同时初始化变量,且尝试修改const 声明的变量会导致运行时错误。
三、数据类型
- 永远不必显示地将变量值设置为 undefined ,但只要变量要保存对象,而当时又没有那个对象可保存,就要用 null 来填充该变量。
- null 和 undefined 都是假值,即使用 if 语句判定时是不成立的。
- NaN (not a number) ,用以表示本来要返回数值的操作失败了。任何设计 NaN 的操作的返回值始终是 NaN , NaN 不等于包括其本身在内的任何值。
- 对于 Namber() 数值转换函数,null 返回 0,undefined 返回NaN。
let num1 = parseInt("1234blue"); // 1234
let num2 = parseInt(""); // NaN
let num3 = parseInt("0xA"); // 10,解释为十六进制整数
let num4 = parseInt(22.5); // 22
let num5 = parseInt("70"); // 70,解释为十进制值
let num6 = parseInt("0xf"); // 15,解释为十六进制整数
let num1 = parseFloat("1234blue"); // 1234,按整数解析
let num2 = parseFloat("0xA"); // 0
let num3 = parseFloat("22.5"); // 22.5
let num4 = parseFloat("22.34.5"); // 22.34
let num5 = parseFloat("0908.5"); // 908.5
let num6 = parseFloat("3.125e7"); // 31250000
let num = 10;
console.log(num.toString()); // "10"
console.log(num.toString(2)); // "1010"
console.log(num.toString(8)); // "12"
console.log(num.toString(10)); // "10"
console.log(num.toString(16)); // "a"
- null 和 undefined 不能使用 toString() 函数,但是可以使用 String() 函数返回其字面量文本。
- 模板字面量使用反引号可以跨行定义字符串
let pageHTML = `
<div>
<a href="#">
<span>Jake</span>
</a>
</div>`;
- 字符串插值会使用 toString() 强制转换为字符串
let foo = { toString: () => 'World' };
console.log(`Hello, ${ foo }!`); // Hello, World!
- 在插值表达式中可以调用函数和方法
function capitalize(word) {
return `${ word[0].toUpperCase() }${ word.slice(1) }`;
}
console.log(`${ capitalize('hello') }, ${ capitalize('world') }!`); // Hello, World!
object 类型的通用属性和方法
属性/方法名 | 作用 |
---|---|
constructor | 用于创建当前对象的函数 |
hasOwnProperty(propertyName) | propertyName):用于判断当前对象实例(不是原型)上是否存在给定的属性 |
isPrototypeOf(object) | 用于判断当前对象是否为另一个对象的原型 |
propertyIsEnumerable(propertyName) | 用于判断给定的属性是否可以使用for-in 语句枚举 |
toLocaleString() | 返回对象的字符串表示,该字符串反映对象所在的本地化执行环境。 |
toString() | 返回对象的字符串表示 |
valueOf() | 返回对象对应的字符串、数值或布尔值表示 |
四、操作符
- 对于正数,无符号右移与有符号右移结果相同,对于复数来说则差异非常大
- 等于( = = )和不等于( != =)会先进行强制类型转换再做比较,其中 null 和 undefined 相等且都不能转换为其他类型的值再进行比较,如果两个操作数都是对象,则仅当指向同一个对象时返回 true
- 全等(= = =)只有两个操作数在不转换的前提下相等才返回 true,特别的 null === undefined 返回的是 false,因为是不用的数据类型
- ECMAScript 中对象的属性是无序的,因此 for-in 语句不能保证返回对象属性的顺序。
- for-of 循环会按照可迭代对象的 next() 方法产生值的顺序迭代元素。
- with 语句的用途是将代码作用域设置为特定的对象
let qs = location.search.substring(1);
let hostName = location.hostname;
let url = location.href;
等同于
with(location) {
let qs = search.substring(1);
let hostName = hostname;
let url = href;
}