表达式和语句
- 语句主要为了进行某种操作(一般会改变环境如:声明、赋值)一般一行 js 代码(可用分号结尾)就是一个语句
- 表达式则是为了得到值,如 1+2(区别值与返回值,只有函数有返回值)
变量提升
JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。
数据类型
包括「值类型」和 「引用类型」两大类。两者有以下区别:
- 存储:
- 值类型存储在栈中
- 引用类型存储在堆中,栈中存储的变量,是指向堆中的引用地址
- 访问机制:
- 值类型按值访问
- 引用类型按引用访问,在访问一个对象时,首先得到的是这个对象在堆内存中的地址,然后再按照这个地址去获得这个对象中的值
- 复制:
- 值类型复制后完全独立,互不影响
- 引用类型复制引用地址,复制后共享一个地址
值类型:
- Boolean
- Undefined
- Number
- BigInt
- String
- 字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。如‘abc’
- 由于 HTML 语言的属性值使用双引号,所以很多项目约定 JavaScript 语言的字符串只使用单引号。
- Symbol
为什么0.1+0.2 !== 0.3?
计算机中所有的数据都是以二进制
存储的,所以在计算的时候,JavaScript 引擎会先将十进制数转换为二进制,然后进行加法运算,再将所得结果转换为十进制。在进制转换过程中如果小数位是无限的,就会出现精度丢失,造成误差。
详细
引用类型:
- Object
- Null(指针指向空地址)
Object:
对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。
- 对象的所有键名都是字符串(ES6 又引入了 Symbol 值也可以作为键名),所以加不加引号都可以,如果键名是数值,会被自动转为字符串。对象的每一个键名又称为“属性”(property)。
- 键值可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用。
Object 又包括很多子类型,比如 Date、Array、Function、Set、RegExp。
类型转换
JavaScript 是一种动态类型语言,变量没有类型限制,可以随时赋予任意值。且在处理不同数据类型运算或逻辑操作时会强制转换成同一数据类型。通常强制转换的目标数据类型为 String、Number、Boolean 这三种。
== 和 === 的使用:
- 只有在 == null 的时候使用 ==
- 其他情况一律使用 ===
如何判断一个数据的数据类型:
1.typeof 可以判断以下三种类型:
- 值类型
- 函数
- 引用类型
类型 | 结果 |
---|---|
Undefined | "undefined" |
Boolean | "boolean" |
Number | "number" |
BigInt | "bigint" |
String | "string" |
Symbol | "symbol" |
函数对象 | "function" |
其他对象及 null | "object" |
//2
//instanceof:用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
let obj = {}
obj instanceof Object // true
//3
//constructor:
function F(){}
let f = new F()
f.constructor === F //true
//4
//Object.prototype.toString.call:
Object.prototype.toString.call(1) ; // [object Number]
//5
//Array.isArray():
console.log(Array.isArray([1,2,3])) //true
逻辑判断
1 && '' // ''
'' && 1 // ''
1 || '' // 1
'' || 1 // 1