Chapter3 语言基础
语法:
1、区分大小写
2、标识符:以字母/下划线/美元符号开始,驼峰命名法
3、单行注释:// 多行注释:/**/
4、严格模式:在函数最上方use strict,现代所有浏览器都支持严格模式
function doSomething() {
"use strict";
// 函数体
}
5、语句以;结尾,代码段用{}包裹
关键字与保留字:
break do in typeof case else instanceof var catch export new void
class extends return while const finally super with continue for switch yield
debugger function this default if throw delete import try
始终保留:
enum
严格模式下保留:implements package public interface protected static let private
模块代码中保留:await
不使用以上关键字和保留字作为标识符或者是对象属性名
变量:
var const let (后两个只支持在ES6及更高版本)
var声明局部变量,函数作用域,不带var创建的对象和属性为全局变量;声明的变量会自动提升至当前代码块最上方,即“提升”
let块作用域,不会被提升,全局声明不允许重名,for循环中定义的迭代变量不会渗透
for (var i = 0; i < 5; ++i) {
setTimeout(() => console.log(i), 0)
}
// 你可能以为会输出0、1、2、3、4
// 实际上会输出5、5、5、5、5
for (let i = 0; i < 5; ++i) {
setTimeout(() => console.log(i), 0)
}
// 会输出0、1、2、3、4
const声明变量时必须同时初始化变量,并且不可修变量的值
声明变量的限制只适用于他指向的变量的引用
const person = {};
person.name = 'Matt'; // ok
const不能用于声明迭代变量,因为迭代变量会自增或自减,但是可以声明一个不会被改变的循环变量
let i = 0;
for (const j = 7; i < 5; ++i) {
console.log(j);
}
// 7, 7, 7, 7, 7
for (const key in {a: 1, b: 2}) {
console.log(key);
}
// a, b
for (const value of [1,2,3,4,5]) {
console.log(value);
}
// 1, 2, 3, 4, 5
总结:优先使用const,其次使用let,最后不使用var
数据类型:
Undefined
、Null
、Boolean
、Number
、String
和Symbol,以及Object,无序键值对的集合
1、typeof判断变量的类型
2、Undefined:声明了变量但是没有初始化
3、null:表示一个空指针对象
4、Boolean:true不等于1,false不等于0
不同类型与布尔值之间的转换规则o
5、Number类型:表示整数型和浮点型
- 浮点值会被尽可能地转化为整形数值
- 值的范围:(5e-324,1.797 693 134 862 315 7e+308),超出使用Infinity表示,可使用isFinite()函数来判断是否为有限值
- NaN表示非数值,isNan判断是否为非数值类型
console.log(isNaN(NaN)); // true
console.log(isNaN(10)); // false,10是数值
console.log(isNaN("10")); // false,可以转换为数值10
console.log(isNaN("blue")); // true,不可以转换为数值
console.log(isNaN(true)); // false,可以转换为数值1
数值转换:Number()、parseInt()、parseFloat()将非数值转换为数值类型
let num1 = Number("Hello world!"); // NaN
let num2 = Number(""); // 0
let num3 = Number("000011"); // 11
let num4 = Number(true); // 1
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 = parseInt("AF", 16); // 175
let num2 = parseInt("AF"); // NaN
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
6、String类型:不可修改,如果要修改某个变量的字符串值,必须先销毁原有的字符串再重新赋值
可使用"、'、`三种来标示,但是前后使用的符号应该一致
let firstName = "John";
let lastName = 'Jacob';
let lastName = `Jingleheimerschmidt`
let firstName = 'Nicholas"; // 语法错误:开头和结尾的引号必须是同一种
使用length属性来获取字符串长度
toString()方法来转换成字符串,不传参
let value1 = 10;
let value2 = true;
let value3 = null;
let value4;
console.log(String(value1)); // "10"
console.log(String(value2)); // "true"
console.log(String(value3)); // "null"
console.log(String(value4)); // "undefined"
字符串插值通过${}来实现
let value = 5;
let exponent = 'second';
// 以前,字符串插值是这样实现的:
let interpolatedString =
value + ' to the ' + exponent + ' power is ' + (value * value);
// 现在,可以用模板字面量这样实现:
let interpolatedTemplateLiteral =
`${ value } to the ${ exponent } power is ${ value * value }`;
console.log(interpolatedString); // 5 to the second power is 25
console.log(interpolatedTemplateLiteral); // 5 to the second power is 25
7、Symbol类型
符号是原始值,且符号是唯一的、不可变的
使用Symbol()进行初始化,但是这个并不是构造函数,不可以和new关键字一起使用
let sym = Symbol();
console.log(typeof(sym));//Symble
let foo = Symbol('foo');
console.log(foo);//Symbol(foo)
let a = Symbol('foo');
let b = Symbol('foo');
console.log(a == b);//false
使用Symbol.for()方法创建全局符号注册表
let a = Symbol.for('foo');
let b = Symbol.for('foo');
console.log(a == b);//true
使用符号作为属性
常用内置符号:不可写,不可枚举,不可配置
Symbol.hasInstance(),复杂版的==比较,确定一个对象实例的原型链上是否有原型
Symbol.isConcatSpreadable,布尔值
Symbol.iterator,返回默认的迭代器
Symbol.match(),正则表达式,接受一个参数作为正则判断的子串或者是模式
Symbol.replace(),用传入的子串替换原有的子串
Symbol.search(),返回子串在字符串中的起始位置
Symbol.species,一个函数值,该函数作为创建派生对象的构造函数、
Symbol.split(),拆分字符串
Symbol.toPrimitive(),一个方法,该方法将对象转换为相应的原始值。由ToPrimitive
抽象操作使用
Symbol.toStringTag(),一个字符串,该字符串用于创建对象的默认字符串描述
8、Object类型
constructor
:用于创建当前对象的函数。在前面的例子中,这个属性的值就是Object()
函数。hasOwnProperty(propertyName)
:用于判断当前对象实例(不是原型)上是否存在给定的属性。要检查的属性名必须是字符串(如o.hasOwnProperty("name")
)或符号。isPrototypeOf(object)
:用于判断当前对象是否为另一个对象的原型。propertyIsEnumerable(propertyName)
:用于判断给定的属性是否可以使用for-in
语句枚举。与hasOwnProperty()
一样,属性名必须是字符串。toLocaleString()
:返回对象的字符串表示,该字符串反映对象所在的本地化执行环境。toString()
:返回对象的字符串表示。valueOf()
:返回对象对应的字符串、数值或布尔值表示。通常与toString()
的返回值相同。