第一部分
1.类型
- js有几种内置类型
基本类型:null,string,undefined,number,boolean,symbol(es6) 引用类型:object - typeof用于未生命变量和声明未赋值变量的区别,为什么会会这样,有什么用处?
没有区别都是undefined
var a;
console.log(typeof b); //undefined
console.log(typeof a); //undefined
为什么会这样,因为typeof有个保护机制,以防报is not defined终止程序,可以利用这个特点去判断变量是否已被声明使用
if(typeof a !== 'undefined'){
//要执行的操作
}
还有什么办法能判断变量是否已经被声明或使用了呢
if(window.a){
//要执行的操作
}
- undefined和is not defined的区别
var a;
console.log(a); //undefined 声明但没有赋值,不会阻断代码
console.log(b); //b is not defined 没有声明,会阻断代码,停止编译
2.值
- slice的用处?常用于?
slice(start,end)是Array内置的一个方法,截取下标start到end(包括start不包括end)的元素,返回一个新的数组.常用于
把一个类数组变为一个数组(es6的Array.from)
function fn(a,b,c) {
console.log(arguments); //Arguments(3) [1, 2, 3, callee: ƒ, Symbol(Symbol.iterator): ƒ]
console.log(Array.prototype.slice.call(arguments)); //[1, 2, 3]
console.log(Array.from(arguments)); //[1, 2, 3]
return
}
fn(1,2,3);
浅拷贝一个数组
const arr = [1,2];
const newArr = arr.slice();
arr.push(3);
console.log(arr); //[1,2,3]
console.log(newArr); //[1,2]
- 字符串是不可变的,数组是可变的,是啥意思.
js里面的字符串是不可以改变的,一旦给变量改变字符串等于销毁了原来的字符串重新生成了个字符串,数组是引用类型的,引用的指针没变,数组还是那个数组,并且可以改变里面的元素.字符串的成员函数不会改变原始值,而是创建返回一个新的元素,数组的成员函数是可以改变自身的值的
const str = 'a';
const arr = [1,2];
str.toUpperCase();
console.log(str); //'a'并没有改变
console.log(str.toUpperCase()); //'A'
arr.push(3);
console.log(arr); //[1,2,3]
-
js存储数字采用什么格式?
js存储数字采用的是64位双精度浮点型,网上找了张图片
1位存储sign符号位,11位存exponent指数位,52位常数位,二进制存储
因为浮点数的关系,怎么判断两个值相等呢?
可以设置一个最小误差,计算小于这个误差的是可以视为相等的,最小误差的值为Math.pow(2,-52),在es6中有Number.EPSILON来获取,也就是2.220446049250313e-16
console.log(Number.EPSILON); //2.220446049250313e-16
function numbersEqual(n1,n2) {
return Math.abs(n1-n2) < Number.EPSILON //Math.abs是绝对值
}
console.log(numbersEqual(0.1 + 0.2, 0.3)); //true解决了0.1+0.2不等于0.3的问题了
void 0 是什么?有什么用?来源于什么?
void 返回值都是undefined,也可以说没返回,利用这个特性,需要使用undefined的时候可以用void 0代替,因为undefined不是敏感字符,是有可能被更改成其他内容的,void 0,void a,void undefined结果都是undefined,源于c语言的习惯,也是老司机们的一种写法NaN是什么?,如何判断NaN?
NaN是number类型的一个特殊值,用于说明某些算术运算的结果不是一个数字,NaN不等于自身
NaN == NaN //false
console.log(NaN != NaN); //true
console.log(NaN !== NaN); //true
判断NaN可以用isNaN,但是js内置的isNaN工具函数有点bug,NaN应该是一个number类型的但又不是数字的一种情况,js内置的isNaN检测不是数字类型的都会返回true,可以使用es6新增的Number.isNaN去判断,不支持es6也可以使用NaN不等于NaN并且typeof是number类型的特性去判断
console.log(isNaN('a')); //true
console.log(isNaN(NaN)); //true
console.log(Number.isNaN('a')); //false
console.log(Number.isNaN(NaN)); //true
- 无穷数值有哪些?
InFinity -InFinity
console.log(-1 / 0); //-Infinity
console.log(1 / 0); //Infinity