1. JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
Javascript的数据类型,共有六种:
- 数值(number):整数和小数
- 字符串(string): 字符组成的文本
- 布尔值(boolean): true和false
- undefined: 表示“未定义”或不存在,即此处没有任何值
- null:表示空缺,即此处应有一个值,但目前为空
- 对象(object): 各种值组成的集合。
通常,将数值,字符串,布尔值称为原始类型,即它们是最基本的数据类型,不能再细分了。而将对象称为复杂类型的值,因为一个对象往往是多个原始类型的值得合成,可以看作是一个存放各种值得容器。至于undefined
和null
,一般将它们看成两个特殊值。
基本类型和复杂类型的区别:
- 基本类型变量存的是值,复杂类型的变量存的是内存地址
- 基本类型再赋值的时候拷贝值,复杂类型再赋值的时候只拷贝地址,不拷贝值。
2. typeof和instanceof的作用和区别?
typeof
是一元运算符,用来返回操作类型的字符串。typeof
实际的应用场景,就是用来检测一个对象是否已经定义或者是否已赋值,不是用来检查对象的类型。为了检测一个对象的类型,强烈推荐使用Object.prototype.toString
方法,应尽量避免使用�typeof
操作符。
instanceof
运算符用来测试一个对象是否在其原型链原型构造函数的属性,object instanceof constructor
instanceof
操作符用来比较两个操作数的构造函数。只有在比较自定义的对象时才有意义。如果用来比较内置类型,将会和typeof
操作符一样用处不大。
3. 如何判断一个变量是否是数字、字符串、布尔、函数
//判断是否是数字
var a = 1;
typeof a === 'number';
//更加保险的方式
Object.prototype.toString.call(a) === '[object Number]';
//判断是否是字符串
var s = 'hello'
Object.prototype.toString.call(s) === '[object String]'
//判断布尔
var b = false;
Object.prototype.toString.call(b) === '[object Boolean]';
//判断函数
function fn(){}
Object.prototype.toString.call(fn) === '[object Function]';
4. NaN是什么? 有什么特别之处?
- NaN是全局属性代表
Not-A-Number
。 - NaN属性的初始值就是
NaN
,和Number.NaN
的值一样 - 通常都是在计算失败时,作为Math的某个方法的返回值出现或者尝试将一个字符串解析成数字失败了的时候。
-
typeof NaN //number
也就是说NaN是一种特殊的Number类型值
5. 如何把非数值转化为数值?
-
Number()
函数- 如果是 Boolean 值,true 和 false 将分别被转换为 1 和0;
- 如果是数字值,只是简单的传入和返回;
- 如来是null 值,返回 0;
- 如果是 undefined,返回NaN ;
- 如果是字符串,遵循下列规则:
- 如果字符串中只包含数字,则将其转换为十进制数值,即"1"会变成1 , "123"会变成123,而"011"会变成11(注意,前导的0被忽略了);
- 如果字符串中包含有效的浮点格式, 如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导零);
- 如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制整数值;
- 如果字符串是空的(不包含任何字符) ,则将其转换为0;
- 如果字符串中包含除上述格式之外的字符,则将其转换为 NaN。
- 如果是对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString() 方法,然后再次依照前面的规则转换返回的字符串值。
parseInt()
由于Number()函数在转换字符串的时候比较复杂而且不够合理,因此在处理整数的时候更常用的是parseInt()
。
parselnt()
函数在转换字符串时,更多的是看其是否符合数值模式,它会忽略字符串前面的空格,直至找到第一个非空格字符;如果第一个字符不是数字字符或者负号,parseInt() 就会返回 NaN;也就是说,用parselnt() 转换空字符时会返回 NaN(Nurnber() 对空字符返回 0); 如果第一个字符是数字字符,parselnt() 会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。例如,"1234blue"会被转换为1234 ,因为"blue"会被完全忽略;类似地,"'22.5"会被转换为22 ,因为小数点并不是有效的数字字符。parseFloat()
与 parseInt () 函数类似,parseFloat () 也是从第一个字符(位置0)开始解析每个字符。而且也是一直解析到字符串末尾,或者解析到遇见一个无效的浮点数字字符为止。也就是说,字符串中的
第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。举例来说,"22.34.5"将会被转换为22.34 。
6. == 与 ===有什么区别
-
严格相等,使用===
全等操作符比较两个值是否相等,两个被比较的值在比较前都不进行隐式转换。如果两个被比较的值具有不同的类型,这两个值是不全等的。在日常中使用全等操作几乎是正确的选择
-
宽松相等,使用==
相等操作符比较两个值是否相等,在比较前将两个被比较的值转换为相同类型。在转换后,最终的比较等于全等操作符===的比较方式。一般都会将 string,boolean类型转换为number 进行比较。如果一个值是对象,一个是数字或字符串,则尝试使用
valueOf
和toString
转换后比较。
7. break与continue有什么区别
- break用于强制退出循环体,执行循环后面的语句
- continue用于退出本次循环,执行下次循环
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
break;
}
console.log(i);
}
// 输出123
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
continue;
}
console.log(i);
}
//输出12356789
8. void 0 和 undefined在使用场景上有什么区别
void
运算符对给定的表达式进行求值,然后返回undefined
。一般使用void(0)等同于void 0,来获取undefined的原始值。void是不能 被重写的。
常用的使用方法:
(function (undefined) {
//...
if (foo !== undefined) {
// ...
}
})();
9. 以下代码输出结果是什么?为什么?
console.log(1+1); // 2
console.log("2"+"4"); //24
console.log(2+"4"); //24
console.log(+"4"); //4
加号
- 在两个操作数都是数字的时候,会做加法运算
- 两个参数都是字符串或在有一个参数是字符串的情况下会把另外一个参数转换为字符串做字符串拼接
- 在参数有对象的情况下会调用其valueOf()或toString
- 在只有一个字符串参数的时候会尝试将其转换为数字
- 在只有一个数字参数的时候返回其正数值
10. 以下代码的输出结果
var a = 1;
a+++a; //3
typeof a+2; //'number2'
11. 以下代码的输出结果
var a = 1;
var b = 3;
console.log( a+++b ); //4
a++ 先赋值再自增 a+++b = 1+3
12. 遍历数组,把数组里的打印数组每一项的平方
var arr = [3,4,5];
//基本
for(var i=0; i<arr.length; i++) {
arr[i] = arr[i] * arr[i];
}
console.log(arr);
//map
arr = arr.map(function(value) {
return value * value;
});
console.log(arr);
13. 遍历JSON,打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for(property in obj){
console.log(obj[property]);
}
console.log(Object.values(obj));
14. 以下代码输出结果是什么?
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
//number2
//逻辑与的短路计算 number2||true 打印出前一个字符串
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
//bb
//首先计算 d ==5 && console.log('bb') 输出 true&&bb, 答应bb
var data2 = d = 0 || console.log('haha')
console.log(data2)
//haha
// d = 0 || console.log('haha'), d 被赋值haha 再赋值给data2
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
// 2
// true + true