1. JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
js定义了6种原始数据类型和对象这种复杂数据类型:
- 原始数据类型
- 数值(number):整数和小数;
- 字符串(string):文本数据;
- 布尔值(boolean):true和false两个特定值;
- undefined:表示“未定义”或不存在,即此处目前没有任何值;
- null:表示空缺,即此处应该有一个值,但目前为空,一般用作对象的占位符;
- symbol(ES6);
- 复杂数据类型
- 对象(object):各种值组成的集合;包括数组(array)、函数(function)、对象(object)、正则表达式(regexp)等;
- 区别
- 复杂数据类型是多个原始数据类型的集合,原始数据类型不能再细分,不是对象也没有方法。
2. typeof和instanceof的作用和区别?
文献
1.MDN instaceof
2.MDN typeof
3.JavaScript instanceof 运算符深入剖析
作用:
- typeof以字符串形式返回操作数的数据类型
//返回"number"
typeof 123
typeof NaN
//"string"
typeof '123'
typeof (typeof 1)
//"boolean"
typeof true
//"function"
typeof function(){}
//"undefined"
typeof undefined
//"object"
typeof null
typeof {a:1}
typeof [1,2]
typeof /ss/
- instanceof判断对象是否为特定的类型
var o = {};
var a = [];
o instanceof Array // false
a instanceof Array // true
function C() {}
var o = new C();
//true
o instanceof C;
//true
o instanceof Object;
- 区别:
typeof:一元运算符,返回值为字符串,难以判断object具体类型;
instanceof:二元运算符,返回值为布尔型,主要用来判断object是否为特定实例。
3. 如何判断一个变量是否是数字、字符串、布尔、函数
如2代码示例
4. NaN是什么? 有什么特别之处?
NaN(Not a Number):非数字,不等于自己
NaN == NaN //false
5. 如何把非数值转化为数值?
parseInt()转换为整数、parseFloat()转换为浮点数、Number()都可以,但转换整个数据;
//忽略字符串前空格
//忽略第第一个非数字后的所有字符
//parseInt('',radix) 可以设置基数
//parseInt()
parseInt('0ab') //0
parseInt('01a') //1
parseInt(' 0a') //0
parseInt('0xf1', 10) //0
parseInt('-1a') //-1
parseInt('0xf1') //241十六进制不用加基数
//第一个非空非数字/±(±后无数字依然NaN),返回NaN
parseInt('-a')
parseInt(null)
parseInt(true)
parseInt(undefined)
parseInt('a')
----------------------------------------------------
//parseFloat()和parseInt()类似,只是会保留小数部分
parseFloat('-2.1a1a') //-2.1
----------------------------------------------------
//Number()可以整数或小数,但会转换整个数据;并且会转换null,true,false
Number('1.2') //1.2
Number('1.2a') //NaN
Number(true) //1
Number(false) //0
Number(null) //0
Number(undefined) //NaN
Number('a')
//其他
Number('\t\r') //0
6. ==与===有什么区别?
== 类型不同,会先尝试转换类型再比较;
=== 类型一致,值相同。
//==相等
//字符串和布尔型比较会转换为数值,类型相同不会转换
true == 1 //true
false == 0 //true
true == 'true' //false,'true'转化为NaN
'' == 0 //true
''==false //true
'' == '0' //false
-----------------
//undefined与null与其他大多数比较都是false
undefined == null //true
undefined == 0 //false
null == 0 //false
undefined == false //false
null == false //false
-----------------
//其他
' \t\t' == 0 //true
//严格相等
1 === 0x1 // true
+0 === -0 //true
--------
//空对象
{} === {} // false
[] === [] // false
(function (){} === function (){}) // false
//未赋值变量
var a,b
a === b //true
7. break与continue有什么区别?
break 跳出循环,用于循环和switch;
continue跳出本次循环,用于循环。
8. void 0 和 undefined在使用场景上有什么区别?
void运算一个表达式,返回defined,所以void 0 返回undefined;因为undefined在函数等中可以作为局部变量赋值,这会使判断值为undefined失效,所以判断中使用void 0代替它。
9.以下代码的输出结果是?为什么?
- 当JavaScript遇到预期为数值的地方,就会将参数值自动转换为数值。系统内部会自动调用Number函数。
console.log(1+1); //2 类型相同,都为数字,直接相加
console.log("2"+"4"); //24 类型相同,都为字符串,直接拼接
console.log(2+"4"); //6 类型不同,一个数字,一个字符串,转换为数字后相加
console.log(+"4"); //4 只有一个字符串运算子,也转换为数字
10.
var a = 1;
a+++a; //++优先级高于+,a++先运算,后自增,(a++)+a为2,a也为2
typeof a+2; //4 typeof优先级高,(type a)+2,type a输出为"number",数字和字符串相加,所以值为“number2”
11.
var a = 1;
var b = 3;
console.log( a+++b ); (a++)+b,a++先运算,后自增,为1+3,输出4
12. 遍历数组,打印数组每一项的平方
var arr = [3,4,5];
for (var i = 0; i <arr.length; i++){
console.log(arr[i]*arr[i]);
}
13. 遍历对象, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (attr in obj){
console.log(obj[attr])
}
14.
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0 //优先级typeof , +, >, || , =
//"number"
//"number2"
//"number2" || true
//或运算符(||)的运算规则是:如果第一个运算子的布尔值为true,则返回第一个运算子的值,且不再对第二个运算子求值;如果第一个运算子的布尔值为false,则返回第二个运算子的值。
//"number2"
console.log(val) //"number2"
var d = 5;
var data = d ==5 && console.log('bb') //优先级 == ,&& , =
//true && console.log('bb')
//打印bb
//因为第一个为true,所以会返回第二个运算子的值
console.log(data) //undefined
var data2 = d = 0 || console.log('haha') //优先级 || , = 其中=为右结合
//打印haha
//0 || consloe.log('haha')
//因为0转换为false,所以返回第二个运算子的值,结果为undefined
console.log(data2) //undefined
var x = !!"Hello" + (!"world", !!"from here!!"); //优先级 ()!+ ,
//true + (false, true)
//true + true转换为数值1+1
//2
console.log(x) //2