1、JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
JavaScript的数据类型共有六种:
- 数值(number):整数和小数(比如1和3.14)
- 字符串(string):字符组成的文本(比如"Hello World")
- 布尔值(boolean):true(真)和false(假)两个特定值
- undefined:表示“未定义”或不存在,即此处目前没有任何值
- null:表示空缺,即此处应该有一个值,但目前为空
- 对象(object):各种值组成的集合
- symbol:数据类型 “symbol” 是一种原始数据类型,它的性质在于可以使用此类型的值来创建匿名的对象属性。
原始类型(primitive type):
数值、字符串、布尔值
它们是最基本的数据类型,不能再细分了。
复杂类型(complex type):对象(object)
对象又可以分成三个子类型:
狭义的对象(object)
数组(array)
函数(function)
正则表达式 (regexp)
至于undefined和null,一般将它们看成两个特殊值。
原始类型和复杂类型的区别:
- 基本类型变量存的是值,复杂类型的变量存的是内存地址
- 基本类型在赋值的时候拷贝值,复杂类型在赋值的时候只拷贝地址,不拷贝值。
2、typeof和instanceof的作用和区别?
typeof是一元运算符,用来获取运算数的数据类型。返回的值有number、boolean、undefined、function、object、string.
对象、数组、null会返回object。正因为typeof遇到数组、null都会返回object,所以我们要判断某个对象是否是数组或者某个变量是否是对象的实例时就要使用instanceof.
instanceof用于判断某个变量是否是某个对象的实例,返回值为true或false.
3、如何判断一个变量是否是数字、字符串、布尔、函数
console.log(typeof x === "number")
console.log(typeof x === "string")
console.log(typeof x === "boolean")
console.log(typeof x === "function")
4、NaN是什么? 有什么特别之处?
NaN (Not a Number) - 表示非数字,NaN和任何值都不相等,包括自己。
5、如何把非数值转化为数值?
- Number()
- parseInt()
- parseFloat()
6、==与===有什么区别
==是值相等,js会在一些情况下进行隐式的类型转换再进行比较。
===是严格相等(包括值和类型)
两个复合类型的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。
7、break与continue有什么区别
break - 跳出整个循环;如果是多层f循环,跳出当前for循环,而不是整个循环。
continue - 跳出本次循环,执行下个循环。
8、void 0 和 undefined在使用场景上有什么区别
undefined 可以被重写,而void操作符则永远会返回undefined
undefined是全局对象的一个属性,因此给它赋值是不会报错的,当某个地方把undefined赋值了,后面要利用undefined来判断某个变量是否是undefined的时候就不成立了,所以使用void 0来代替undefined。
代码题
9、
console.log(1+1); //2 加法运算
console.log("2"+"4"); //24 字符串拼接
console.log(2+"4"); // 24 数字转换为字符串后进行拼接
console.log(+"4"); // 4 只有一个字符串时,+"4"相当于Number("4")
10、
var a = 1;
a+++a; // 3 ++优先级高于+ a+++a相当于 (a++)+a,a++先使用后自加1于是:(a++)+a=1+2=3
typeof a+2; // number2 typeof优先级高于+,相当于(typeof a)+ 2 ,即"number"+2
11、
var a = 1;
var b = 3;
console.log( a+++b ); // 4 (a++)+3,a++先使用后自加1 于是1+3=4
12、
遍历数组,把数组里的打印数组每一项的平方
var arr = [3,4,5]
var arr = [3,4,5];
for (var i=0; i<arr.length; i++){
console.log(Math.pow(arr[i],2));
}
13、 遍历 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for(key in obj){
console.log(key,obj[key]);
}
14、以下代码输出结果是? 为什么 (选做题目)
(1)
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val) // number2
逻辑或(||)第一个运算子的布尔值为true,则返回第一个运算子的值。
根据优先级 val=((typeof a) + (b)) || (c > 0)
(2)
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
//bb
//undefined
console.log('bb')输出字符串bb
== 优先级高于&&,于是data=(d==5) && console.log('bb')
且运算符运算规则:第一个运算子的布尔值为true,返回第二个运算子的值。函数console.log('bb')没有返回值,故data=undefined
(3)
var data2 = d = 0 || console.log('haha')
console.log(data2)
var data2 = d = 0 || console.log('haha')
console.log(data2)
//haha
//undefined
或运算符的第一个运算子的布尔值为false,返回第二个运算子的值。
函数console.log 没有返回值,d=undefined,data2=d=undefined
(4)
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x) //2
!!"Hello"为true;
!"world"为false;
!!"from here!!"为true
true+true,类型转换,计算得2