1. JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
- 6种数据类型:数值(number)、字符串(string)、布尔值(boolean)、undefined、null、对象(object)
-
原始数据类型:
- 数值(number):整数和小数;
- 字符串(string):文本数据;
- 布尔值(boolean):true和false两个特定值;
- undefined:表示“未定义”或不存在,即此处目前没有任何值;
- null:表示空缺,即此处应该有一个值,但目前为空,一般用作对象的占位符;
- symbol(ES6);
-
复杂数据类型:
- 对象(object):各种值组成的集合;包括数组(array)、函数(function)、对象(object)、正则表达式(regexp)等;
2. typeof和instanceof的作用和区别?
- typeof用于基本数据类型的类型判断,返回值都为小写的字符串。如果是对象,除了function类型会返回“function”, 其他对象统一返回“object”。
typeof 123 // "number" /*数值返回"number"*/
typeof '123' // "string" /*字符串返回"string"*/
typeof false // "boolean" /*布尔值返回"boolean"*/
/*函数返回"function"*/
function f() {}
typeof f // "function"
/*undefined 返回 undefined*/
typeof undefined // "undefined"
/* 其余的返回object*/
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
- instanceof 利用原型链继承关系做判断,它针对对象类型(格式:对象 instanceof 构造函数)。
var a = {};
var b = [];
a instanceof Array // false
b instanceof Array // true
//true
function C() {}
var a = new C();
a instanceof C;
- 区别:
- typeof是判断变量是什么基本类型的
- instanceof是判断对象到底是什么类型的;
3. 如何判断一个变量是否是数字、字符串、布尔、函数
typeof运算符(2详细写的)
4. NaN是什么? 有什么特别之处?
- NaN(Not a Number):表示非数值,是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。
-
注:涉及NaN的操作(如:NaN/10)都会返回NaN;NaN与任何值都不相等,包括NaN本身
NaN === NaN // false /*NaN不等于它本身*/
5. 如何把非数值转化为数值?
三个函数:Number();
, parseInt();
;,parseFloat();
- Number():将任何类型的值转化为数值。但Number规则相当复杂而且不合理
转换规则如下:- 如果是Boolean值,true和false分别转化为1和0
- 如果是数字,只是简单的传入和返回
- 如果是null, 返回0
- 如果是undefined, 返回NaN
- 如果是如果是字符串,按照下面的规则:
- 如果只包含数字,则将其转化为十进制。
- 如果数字中包含浮点格式,比如‘1.1’转化为1.1
- 如果包含有效的十六进制,比如‘0xf’转化为15
- 如果字符串是空的(不包含任何字符)转化为0
- 如果包含上述其他的格式转化为NaN
- 如果是对象,则调用对象的valueOf()方法,依照前面的规则转化,如果结果为NaN,则调用对象的toString()方法,再次按照前面的方法转换返回的字符串
Number(null) //0
Number('abc') //NaN
Number('') //0
Number({toString:function(){return '123'; }}) //123
Number({valueOf:function(){return 456; }}) //456
-
parseInt():把值转换成整数;parseFloat():把值转换成浮点数
使用规则:- 忽略字符串前面的空白字符,找到第一个非空白字符
- 如果第一个字符不是-或者数字返回NaN
- 如果是继续解析,直到非数值模式为止
- 0开头会当做八进制,0x开头会当做十六进制,但是可以指定第二个参数指定基数
6. ==与===有什么区别
===是严格意义的相等;==是近似相等,使用==的时候,javascript会帮我们做类型转换如果两个值类型相同,则执行严格相等的运算
- 如果两个值类型相同,则执行严格相等的运算
- 如果两个值的类型不同
- 如果一个是null,一个是undefined,那么相等
- 如果一个是数字,一个是字符串,先将字符串转为数字,然后比较
- 如果一个值是true/false则将其转为1/0比较
- 如果一个值是对象,一个是数字或字符串,则尝试使用valueOf和toString转换后比较
- 其它就不相等了
7. break与continue有什么区别
- break 用于强制退出循环体,执行循环后面的语句 跳出循环体
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
break;
}
console.log(i);
} // 1,2,3
- continue 用于退出本次循环,执行下次循环 跳出单次循环
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
continue;
}
console.log(i);
} //1,2,3,5,6,7,9
8. void 0 和 undefined在使用场景上有什么区别
- undefined 不能被重写。但是在局部作用域中,还是可以被重写的。
所以undefined现常用于全局环境 - void 运算符通常只用于获取 undefined 的原始值,一般使用 void 0。在上述情况中,也可以使用全局变量undefined 来代替(假定其仍是默认值)。而 void 可以给任何给定的表达式求值,并返回 undefined,并且 void 不可被重写,因此void 0是在局部作用域中替代undefined的最佳选择。
9. 以下代码的输出结果是?为什么?
console.log(1+1); //2 两种数值类型相加,结果为2
console.log("2"+"4"); //"24" 类型相同,两字符串拼接,结果为"24"
console.log(2+"4"); //"24" 类型不同,转换为符串后拼接,结果为"24"
console.log(+"4"); //4 只有一个字符串运算子,也转换为数字
加法运算符有如下规则:
- 在两个操作数都是数字的时候,会做加法运算;
- 两个参数都是字符串或在有一个参数是字符串的情况下会把另外一个参数转换为字符串做字符串拼接;
- 在参数有对象的情况下会调用其valueOf或toString;
- 在只有一个字符串参数的时候会尝试将其转换为数字;
- 在只有一个数字参数的时候返回其正数值。
10.
var a = 1;
a+++a; //(a++)+a,a++返回值为1,a自增运算为2,即1+2=3
typeof a+2;//"number2" ,相当于(typeof a)+2即"number"+2,字符串的拼接
11.
var a = 1;
var b = 3;
console.log( a+++b );//(a++)+b,a++返回值为1,即1+3=4
12. 遍历数组,把数组var arr = [3,4,5]
里的打印数组每一项的平方
var arr = [3,4,5]
for(var i=0;i<3;i++){
console.log(arr[i]*arr[i])
}
13.
遍历 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for(var kay in obj){
console.log(obj[key])
}
14.
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0;
//( typeof a )+b即number+b,字符串的拼接"number2"
console.log(val)
//number2 || true
//或运算符(||)的运算规则是:
//如果第一个运算子的布尔值为true,则返回第一个运算子的值,且不再对第二个运算子求值;
//如果第一个运算子的布尔值为false,则返回第二个运算子的值。
var d = 5;
var data = d ==5 && console.log('bb')
//(d ==5 ) && console.log('bb')
console.log(data)//undefined
//或运算符(&&)的运算规则是:
//如果第一个运算子的布尔值为true,则返回第一个运算子的值
//如果第一个运算子的布尔值为false,则返回第二个运算子的值。
var data2 = d = 0 || console.log('haha')
//data2 =<( d = (0 || console.log('haha') )),=为右结合
//0转换为false,所以返回第二个运算子的值,结果为undefined
console.log(data2)
var x = !!"Hello" + (!"world", !!"from here!!");
//(!!"Hello") + ((!"world"), (!!"from here!!"))
//true + (false, true)
//true+true,都是原始类型,转化为数值相加,结果输出2
console.log(x)
网友评论