1、 JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
一共6种数据类型:数值类型,字符串类型,布尔类型,null,undefined,对象
原始类型有:数值类型,字符串类型,布尔类型
null,undefined被视为特殊类型的值。
复杂类型:对象,一般将对象看成多个个原始类型的值的合成,可以看作是一个存放各种值的容器。
原始类型和复杂类型的区别:(参考 https://zhuanlan.zhihu.com/p/22400319)
如果变量存储的是原始值,那么这个变量就是值类型,在 JS 里也叫做基本类型。
如果变量存储的是内存位置,那么这个变量就是引用类型,在 JS 里也叫复杂类型,也就是对象。
2、typeof和instanceof的作用和区别?
typeof可以返回后面的值是哪种数据类型的
typeof 4 number
typeof "haha" string
typeof undefined undefined
typeof false boolean
function f() {}
typeof f function
typeof [0,1,2,3,4] object
其他也都会返回object
instanceof是判断某个对象是不是一个数组的。
var a = {};
var b = [];
a instanceof Array false
b instanceof Array true
3、如何判断一个变量是否是数字、字符串、布尔、函数
最简单的就是使用typeof来判断,可以返回相对应的数据类型,如:
typeof 10 number
typeof "haha" string
typeof undefined undefined
typeof false boolean
typeof true boolean
function a() {}
typeof a function
4、NaN是什么? 有什么特别之处?
NaN意思是not a number。意指不是一个数字,这是个比较神奇的值,因为它自己都不等于自己。
使用typeof NaN得到的是 number这样的结果。
NaN === NaN 返回false
Number("hsbdsb") 返回NaN
5、如何把非数值转化为数值?
使用Number来进行转化,空字符串会转化为0;使用parseInt()或parseFloat()会将数字转化为整数或浮点数;parseInt()可以在第一个参数后再加一个,意指转化为什么进制的数字。
parseInt(13,10) 13
parseInt(11,2) 3
6、== 与 === 有什么区别?
- == 是判断值是否相等
- === 是首先判断值的数据类型是否相同,再判断值是否相同,和==比起来,===更加严密一些。
7、break与continue有什么区别?
循环中,bieak是强制终止循环并跳出循环,执行循环后面的语句;continue是只跳过当次循环,执行下一次循环,而不是强制终止循环。
8、void 0 和 undefined在使用场景上有什么区别
viod运算符的作用是执行一个表达式,并返回undefined
undefined是可以赋值的,因此在JS文件中我们可能无法确认undefined是否被赋值,当需要确认某个变量是否是undefined时,可以使用这样的方法进行判断
var num;
if(num === void 0){
alert("num is empty")
}
9、以下代码的输出结果是?为什么?
console.log(1+1); 2 计算数字
console.log("2"+"4"); 24 字符串拼接
console.log(2+"4"); 24 字符串拼接
console.log(+"4"); 4 4 字符串转为数字
10、以下代码的输出结果是?
var a = 1;
a+++a; //得到3 因为++的优先级比+高,所以就变成了a(++)+a;即1+2
typeof a+2; //number2 typeof优先级比较高,typeof a得到number再加2,相当于字符串拼接,即number2
11、 以下代码的输出结果是? 为什么
var a = 1;
var b = 3;
console.log( a+++b ); 得到4 因为++的优先级比+高,即(a++)+b
12、遍历数组,打印数组每一项的平方
var arr = [3,4,5]
//实现
for(var i = 0; i
13、遍历 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
//实现
for(var attr in obj){
console.log(obj[attr])
}
14、以下代码输出结果是? 为什么
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
//number2
//原因:typeof优先级比较高,typeof a得到number再加上b得到字符串拼接的结果number2,因为后面是或运算符因此就执行第一个得到number2
var d = 5;
var data = d == 5 && console.log('bb')
console.log(data)
//undefined
//原因:==和&&优先级比=高,==比&&优先级高,所以会先判断d==5这个语句,得到true,因为后面是&&运算符,所以还要向后继续判断;再看&&后面的语句,在控制台打印出bb,得到bb。但是
var data2 = d = 0 || console.log('haha')
console.log(data2)
//undefined
//原因:重新给d赋值,d=0,赋值语句没有问题,得到true,因为后面是或运算符,所以还要向后继续判断,后面的语句在控制台打印出haha,得到haha
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
//!!是强制转换类型为布尔值;等号后面可以看成两个语句,第一个!!"hello",得到true;第二个(!"world", !!"from here!!")可以转换为(false,true),根据逗号运算符的规律(!"world", !!"from here!!")取最后一个得到的值即true,现在为止就得到:var x = true + true;true与true相加会强制转换为数字进行相加,true可以看成1,就得到x=2.