1.JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
- 定义的数据类型有:数值、字符串、布尔、对象、undefined、null
- 原始类型:数值、字符串、布尔
- 复杂类型:对象
- 区别:原始类型数据不能再细分;复杂类型,是由多个原始类型合成,可以看作一个存储各种值的容器。
至于undefined,null一般将它们看成两个特殊值。
2.typeof和instanceof的作用和区别?
- typeof 一般用于判断原始类型,还可以用于判断变量是否赋值.
- instanceof一般用于判断一个变量是否为某个对象的实例。
3.如何判断一个变量是否是数字、字符串、布尔、函数
用typeof运算符进行判断数字、字符串、布尔、函数,分别返回number, string,boolean,fuction。
4.NaN是什么? 有什么特别之处?
NaN是指NOT a Number,用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了),就会返回“NaN”值。NaN 值非常特殊,因为它“不是数字”,所以任何数跟它都不相等,甚至 NaN 本身也不等于 NaN 。
5.如何把非数值转化为数值?
使用Number() 、parseInt() 、parseFloat()把非数值转化为数值
- Number():当转换原始类型数据时,它们都能被转成数值或NaN,Number函数将字符串转为数值,要比parseInt函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN;Number方法的参数是对象时,将返回NaN,除非是包含单个数值的数组。
- parseInt() :字符串若第一个数为数值,则返回数值,返回值为第一个数值到最后一个数值,数值之间没有字母,只取整数,遇到小数点后面的数就舍弃,若第一个数为字母,则直接返回NaN;Boolean、undefined、null返回NaN;数组返回数组的第一个数值;狭义的对象、函数返回NaN。
- parseFloat():和parseInt()类似,只是遇到小数会保留。
6.==与===有什么区别
- ==:相等运算符,比较不同类型的数据时,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。类型转换规则如下:
- 原始类型的数据会转换成数值类型再进行比较。
- 对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转化成原始类型的值,再进行比较。
- undefined和null与其他类型的值比较时,结果都为false,它们互相比较时结果为true。绝大多数情况下,对象与undefined和null比较,都返回false。只有在对象转为原始值得到undefined时,才会返回true,这种情况是非常罕见的。
- 相等运算符隐藏的类型转换,会带来一些违反直觉的结果。
'' == '0' // false
0 == '' // true
0 == '0' // true
2 == true // false
2 == false // false
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true
- ===:严格相等运算符,它不仅比较值,而且还比较值的类型。比较规则:
- 如果两个值的类型不同,直接返回false;
- 同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相同就返回true,值不同就返回false;
- 两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象;
- undefined和null与自身严格相等。
7.break与continue有什么区别
- break:强制退出循环体,执行循环后的语句。
- continue:退出本次循环,执行下一个循环。
注意:如果存在多重循环,不带参数的break语句和continue语句都只针对最内层循环。
8.void 0 和 undefined在使用场景上有什么区别
undefined 现常用于全局环境,不能被重写。但是在局部作用域中,还是可以被重写的。
void 是不能被重写的。 void 运算符能对给定的表达式进行求值,然后返回 undefined,最短的是void 0,所以用void 0 来表示undefined, void 0是在局部作用域中替代undefined的最佳选择,避免undefined被改写。
9.以下代码的输出结果是?为什么?
console.log(1+1); // 2 数值类型的值相加
console.log("2"+"4"); // "24" 字符串类型变量进行拼接
console.log(2+"4"); // "24" 字符串和数值相加会把数值转换为字符串再进行拼接
console.log(+"4"); // 4 在只有一个字符串参数的时候会尝试将其转换为数字
10. 以下代码的输出结果是?
var a = 1;
a+++a; // 3 ,++优先级高于 + ,先计算a++ ,1+2=3
typeof a+2; // "number2" , typeof 优先级高于 + ,先求type a ,"number" + 2
11. 以下代码的输出结果是? 为什么
var a = 1;
var b = 3;
console.log( a+++b );
结果为4 , a+++b = (a++)+b = 1+3 =4
12. 遍历数组,把数组里的打印数组每一项的平方
var arr = [3,4,5];
for(i in arr) {
console.log(arr[i]*arr[i]);
}
13. 遍历 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (key in obj) {
console.log(obj[key]);
}
14.
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
// 'number2', typeof 优先级高于'+',typeof a + b 为'number2'为true,由于运算符是||,左边true则返回左边的值'number2'
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
// "bb", 运行 console.log("bb")时的输出;
// undefined, data的值,data = true && console.log("bb"), console.log("bb")的值为undefined, 由于运算符为&&,第一个运算子的布尔值为true,则返回第二个运算子的值,则data为undefined
var data2 = d = 0 || console.log('haha')
console.log(data2)
// "haha", 运行console.log("haha")时的输出;
// undefined, 由于运算符为||,左运算子的布尔值为false,则返回右运算子的值,则data2为undefined
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
// 2 , !!"Hello" + (!"world", !!"from here!!") = !!(true)+(!true,!!true)=!!true + !!true =true+ true= 2
//逗号运算符用于对两个表达式求值,并返回后一个表达式的值。