1.JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
JavaScript定义了6种数据类型:数值、字符串、布尔值、undefined、null、对象。
原始类型:数值、字符串、布尔值;
复杂类型:对象。
我们将数值、字符串、布尔值称为原始类型(primitive type)的值,即它们是最基本的数据类型,不能再细分了。而将对象称为合成类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。至于undefined和null,一般将它们看成两个特殊值。
对象又可以分成三个子类型:
狭义的对象(object)
数组(array)
函数(function)
2.typeof和instanceof的作用和区别?
typeof运算符可以返回一个值的数据类型,可能有以下结果。
(1)原始类型
数值、字符串、布尔值分别返回number、string、boolean。
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
(2)函数
函数返回function。
function f() {}
typeof f
// "function"
(3)undefined
undefined返回undefined。
typeof undefined
// "undefined"
利用这一点,typeof可以用来检查一个没有声明的变量,而不报错。
v
// ReferenceError: v is not defined
typeof v
// "undefined"
上面代码中,变量v没有用var命令声明,直接使用就会报错。但是,放在typeof后面,就不报错了,而是返回undefined。
实际编程中,这个特点通常用在判断语句。
// 错误的写法
if (v) {
// ...
}
// ReferenceError: v is not defined
// 正确的写法
if (typeof v === "undefined") {
// ...
}
(4)其他
除此以外,其他情况都返回object。
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
从上面代码可以看到,空数组([])的类型也是object,这表示在JavaScript内部,数组本质上只是一种特殊的对象。
另外,null的类型也是object,这是由于历史原因造成的。1995年JavaScript语言的第一版,所有值都设计成32位,其中最低的3位用来表述数据类型,object对应的值是000。当时,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),完全没考虑null,只把它当作object的一种特殊值,32位全部为0。这是typeof null返回object的根本原因。
为了兼容以前的代码,后来就没法修改了。这并不是说null就属于对象,本质上null是一个类似于undefined的特殊值。
既然typeof对数组(array)和对象(object)的显示结果都是object,那么怎么区分它们呢?instanceof运算符可以做到。
var o = {};
var a = [];
o instanceof Array // false
a instanceof Array // true
3.如何判断一个变量是否是数字、字符串、布尔、函数
使用typeof运算符返回一个值的数据类型。
4.NaN是什么? 有什么特别之处?
NaN含义是Not a Number,表示非数字,NaN和任何值都不相等,包括自己。
字符串:如果不可以被解析为数值,返回NaN;undefined:转成 NaN;
NaN==NaN
false
NaN===NaN
false
5.如何把非数值转化为数值?
有三个函数可以把非数值转换为数值
- Number()
- parseInt()
- parseFloat()
Number函数,强制转换,可以将任意类型的值转化成数值。Number函数将字符串转为数值,要比parseInt函数严格很多。基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN。
parseInt parseFloat
1.忽略字符串前面的空白字符,找到第一个非空白字符
2.如果第一个字符不是-或者数字返回NaN
3.如果是继续解析,直到非数值模式为止
4.0开头会当做八进制,0x开头会当做十六进制,但是可以指定第二个参数指定基数
parseInt('blue'); //NaN
parseInt('-23ABS'); // -23
parseInt('0xf1'); // 241
parseInt('101', 2); // 5
parselnt()转化成整数,parseFloat()转化成小数。
6.==与===有什么区别
==是近似相等,===是绝对相等。Js代码尽量使用绝对相等(===)。
使用==的时候,javascript会帮我们做类型转换,造成一些匪夷所思的结果:
- 如果两个值类型相同,则执行严格相等的运算
- 如果两个值的类型不同
如果一个是null,一个是undefined,那么相等
如果一个是数字,一个是字符串,先将字符串转为数字,然后比较
如果一个值是true/false则将其转为1/0比较
如果一个值是对象,一个是数字或字符串,则尝试使用valueOf和toString转换后比较
7.break与continue有什么区别
break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行。
break语句用于跳出代码块或循环。
continue语句用于立即终止本轮循环,返回循环结构的头部,开始下一轮循环。
如果存在多重循环,不带参数的break语句和continue语句都只针对最内层循环。
8.void 0 和 undefined在使用场景上有什么区别
undefined可以在局部作用域中被覆写,而void运算返回都是undefined。
9.以下代码的输出结果是?为什么?
console.log(1+1); answer: 2
console.log("2"+"4"); answer:"24"
console.log(2+"4"); answer: "24"
console.log(+"4"); answer: 4
字符串的自动转换,主要发生在加法运算时。当一个值为字符串,另一个值为非字符串,则后者转为字符串。
除了加法运算符有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值。
一元运算符也会把运算子转成数值。
10. 以下代码的输出结果是?
var a = 1;
a+++a;
typeof a+2;
answer: "number2"
typeof优先级比+高;
11. 以下代码的输出结果是? 为什么
var a = 1;
var b = 3;
console.log( a+++b );
answer: 4
可以理解为(a++)+b为1+3为4
12. 遍历数组,把数组里的打印数组每一项的平方
var arr = [3,4,5];
for (i=0;i<3;i+=1){
console.log(arr[i]*arr[i])
};
13. 遍历 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (key in obj) {
console.log(key,":",obj[key]);
}
14. 以下代码输出结果是? 为什么 (选做题目)
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
answer:"number2"
或运算符(||)的运算规则是:如果第一个运算子的布尔值为true,则返回第一个运算子的值,且不再对第二个运算子求值;如果第一个运算子的布尔值为false,则返回第二个运算子的值。
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
答案:bb
undefined
console.log('bb')此函数表达式的返回值赋值给data,此函数表达式的返回值为undefined,所以data为undefined.
且运算符的运算规则是:如果第一个运算子的布尔值为true,则返回第二个运算子的值(注意是值,不是布尔值);如果第一个运算子的布尔值为false,则直接返回第一个运算子的值,且不再对第二个运算子求值。
var data2 = d = 0 || console.log('haha')
console.log(data2)
answer: haha
undefined
或运算符(||)的运算规则是:如果第一个运算子的布尔值为true,则返回第一个运算子的值,且不再对第二个运算子求值;如果第一个运算子的布尔值为false,则返回第二个运算子的值。
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
answer:2
取反运算符形式上是一个感叹号,用于将布尔值变为相反值,即true变成false,false变成true。
对于非布尔值的数据,取反运算符会自动将其转为布尔值。规则是,以下六个值取反后为true,其他值取反后都为false。
undefined
null
false
0(包括+0和-0)
NaN
空字符串('')