一、数据类型
1、JavaScript有几种数据类型?
- number:数字类型
- string:字符串类型
- boolean:布尔值类型
- null:空值类型
- undefined:未定义类型
- object:对象类型
- symbol:symbol类型
(1)基本数据类型
- number、string、boolean、null、undefined、symbol
(2)复杂数据类型
- Object,包含 Function、Array、Date、RegExp、Math
2、判断数据类型的方式
(1)typeof
typeof
操作符返回一个字符串,表示未经计算的操作数的类型。- typeof对于基本数据类型,除了null,其他都显示正确的类型。
- typeof对于复杂数据类型,除了function,其他都显示object。
typeof function() {} // 'function'
typeof null === 'object' // true
typeof NaN === 'number' // true
(2)instanceof
instanceof
运算符用于检测构造函数的prototype
属性是否出现在某个实例对象的原型链上。- instanceof可以准确判断复杂数据类型。
let arr = [1,2,3]
arr instanceof Array // true
(3)Object.prototype.toString.call()
toString()
方法返回一个表示该对象的字符串。- 能够准确判断所有的数据类型。
Object.prototype.toString.call( [] ) // '[object Array]'
(4)isArray
- Array.isArray() 用于确定传递的值是否是一个数组。
Array.isArray([1, 2, 3]); // true
3、null和undefined的区别?
- 都代表空值。
- 转布尔值都是false。
- null是一个对象未初始化,或将某个变量设置为空值。
- undefined是初始化了,但未定义赋值。
null == undefined // true
null === undefined // false
null + 1 // 1
undefined + 1 // NaN
4、数据类型转换
(1)转字符串
(2)转数字型
'A' - 'B' + 2 // NaN2
Number('') // 0
(3)转布尔型
- 在需要布尔值的地方,除了0,-0,“”,NaN,null,undefined转为false,其他所有值都转为 true,系统内部会调用Boolean函数。
5、== 和 === 的区别?
(1)==
- 在比较中会先进行类型转换,再确定操作数是否相等。
- 简单类型与简单类型比较,字符串和布尔值会转换为数字,再比较。
- 简单类型与引用类型比较,对象转换成其原始类型的值,再比较。
- 引用类型与引用类型比较,则比较它们是否指向同一个对象。
- 如果有NaN,返回false。
(2)===
- 只有两个操作数在不转换的前提下相等才返回true。
二、作用域
1、什么是作用域?
- 即变量和函数生效的区域。
- 在ES5和ES6中,分为三类作用域:全局作用域、函数作用域、块级作用域。
(1)全局作用域
- 任何不在函数中或在大括号中声明的变量,都在全局作用域下。
- 全局作用域下声明的变量可在程序的任意位置访问。
(2)函数作用域
- 如果一个变量是在函数内声明的,它就在一个局部作用域下。
- 这些变量只能在函数内部访问。
(3)块级作用域
- ES6引入了let和const关键字,在大括号中使用let或const声明的变量处于块级作用域下。
- 在大括号之外无法访问这些变量。
2、什么是作用域链?
- 当使用一个变量时,JS引擎会尝试在当前作用域下查找该变量,如果没找到, 再到它的上层作用域查找,以此类推直到全局作用域。
- 如果在全局作用域仍找不到该变量,就放弃查找。
三、预解析
1、什么是预解析?
- JS引擎在运行JS代码时分为两步:预解析和代码执行。
- 预解析:js引擎会把 js 里面所有的 var和function声明的变量在内存中进行提前声明。
- 代码执行:从上往下执行JS语句。
- 预解析也叫变量提升和函数提升。
(1)变量提升
- 把所有的变量声明(var)提升到当前作用域的最前面,但不提升赋值操作。
(2)函数提升
- 把所有的函数声明提升到当前作用域的最前面,但不调用函数。
(3)优先级
- 在提升的过程中,相同的函数会覆盖上一个函数,并且函数提升优先于变量提升。
2、函数声明和函数表达式的区别?
- 函数声明:享受函数提升
- 函数表达式:归类于变量声明,享受变量提升
console.log(fun) // fun () {}
// 函数表达式
var fun = function(name) {}
// 函数声明
function fun () {}
console.log(fun) // fun (name) {}
3、暂时性死区?
- 只要块级作用域内有let声明的变量,它就“绑定”这个区域,不受外部的影响。
- 在let声明变量之前,该变量都是不可用的。这称为“暂时性死区”(temporal dead zone)。
var tmp = 123;
if(true){
tmp = 'abc' //ReferenceError
let tmp;
}
四、内置对象
1、Math对象常用方法
2、数组对象常用方法
方法 | 作用 | 返回值 | 是否影响原数组 |
---|---|---|---|
push(element1, …, elementN) | 将一个或多个元素添加到数组的末尾 | 返回数组新长度 | √ |
pop() | 从数组中删除最后一个元素,数组长度-1 | 返回该元素值 | √ |
unshift(element1, …, elementN) | 将一个或多个元素添加到数组的开头 | 返回数组新长度 | √ |
shift() | 从数组中删除第一个元素,数组长度-1 | 返回该元素值 | √ |
reverse() | 将数组中元素的位置颠倒 | 返回数组 | √ |
sort() | 对数组的元素进行排序 | 返回数组 | √ |
splice(start[, deleteCount[, item1[, item2[, …]]]]) | 删除或替换数组的元素 | 返回被处理项目的数组 | √ |
slice([begin[, end]]) | 截取数组的元素,左闭右开 | 返回被截取项目的数组 | × |
join([separator]) | 将一个数组所有元素连接成字符串 | 返回字符串 | × |
concat() | arr1.concat(arr2, arr3) 合并两个或多个数组 | 返回数组 | × |
indexOf( searchElement ) | 数组中查找给定元素的第一个索引 | 如果存在返回索引号,否则返回-1 | × |
forEach() | 遍历数组,为数组中含有效值的每一项执行一次 callback 函数 | 没返回值 | × |
map() | 遍历数组,为数组中含有效值的每一项执行一次 callback 函数 | 返回数组 | × |
filter() | 对数组每一项进行判断 | 返回符合规则的新数组 | × |
every() | 测试数组每一项是否符合规则 | 返回布尔值 | × |
some() | 测试数组是否至少有一项符合规则 | 返回布尔值 | × |
flat() | 数组扁平化 | 返回数组 | × |
(1)数组的splice 与 slice 的区别?
方法 | 参数 | 描述 |
---|---|---|
splice | splice(start,num,item1,item2,…) | 从start索引开始,截取num个元素,并插入item1、item2到原数组里,影响原数组 |
slice | slice(start,end) | 从start开始,截取到end - 1,如果没有end,则截取到最后一个元素,不影响原数组 |
- 参考网站:https://blog.csdn.net/qq_39132756/article/details/85007082
3、字符串对象常用方法
方法 | 作用 |
---|---|
charAt(index) | 从一个字符串中返回指定的字符 |
substring( Start[, End]) | 返回在开始索引到结束索引之间的新字符串,左闭右开 |
replace() | 返回一个由替换值更换掉待处理值的字符串 |
split() | 返回一个由分隔符分割成子字符串的数组 |
toUpperCase() | 将调用该方法的字符串转为大写形式并返回 |
toLowerCase() | 将调用该方法的字符串转为小写形式并返回 |