-
JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
JavaScript定义了如下数据类型:
1.数值(number):整数和小数(如1、2、3、3.14);
2.字符串(string):由字符组成的文本,又单引号或双引号括起来(如'hellow');
3.布尔值(boolean):只有true和false两个特定值;
4.undefined:表示“未定义”或不存在,即此处目前没有任何值;
5.null:表示空缺,即此处应该有一个值,但目前为空;
6.对象(object):对象是属性的集合,每个属性都由“名/值对(值可以为数值,字符串,也可以忽视对象)”构成。对象又可以分为普通对象、数组和函数。
数值、字符串、布尔值称为原始类型,对象称为对象类型或复杂类型,null和undefined一般看作特殊的类型。
原始类型和复杂类型的区别:
1.原始类型的值是不可变的,复杂类型的值是可变的;
2.原始类型的比较是值的比较,复杂类型的比较是引用的比较;
3.原始类型的变量是存放在栈区的,.复杂类型的值是同时保存在栈内存和堆内存中的对象。
-
typeof和instanceof的作用和区别?
typeof可以判断一个值的数据类型:
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"
但是typeof不能识别数组和对象,上面例子中数组和对象都返回object;
instanceof则可以判断一个对象是否为某一数据类型,或一个变量是否为一个对象的实例并返回boolean类型:
var a={};
var b=[];
a instanceof Array //false
b instanceof Array //true
利用instanceof就可以识别数组和对象。
-
如何判断一个变量是否是数字、字符串、布尔、函数?
可以利用typeof运算符:
typeof 123 // "number" /*数值返回"number"*/
typeof '123' // "string" /*字符串返回"string"*/
typeof false // "boolean" /*布尔值返回"boolean"*/
/*函数返回"function"*/
function f() {}
typeof f
// "function"
-
NaN是什么? 有什么特别之处?
JavaScript在期望使用某些类型的值时,会根据需要自行转换类型,如:当JavaScript期望使用一个布尔值的时候,你可以提供任意类型的值,JavaScript将根据需要自行转换类型,一些值(真值)转换为trun,其他值(假值)转换为false。这在其他类型中通样适用:如果JavaScript期望使用一个字符串,它会把给定的值转换为字符串。
当JavaScript期望使用一个数字,它会把给定的值转换为数字,如果转换结果无意义,则将转换为NaN:
var n= 1-'x'; // NaN /*'x'无法转换为数字*/
NaN是一个"number",但是它不是一个确定的number,只是一个类型,所以它有一个最大的特点:
NaN === NaN // false /*NaN不等于它本身*/
-
如何把非数值转化为数值?
可以使用下面三种方法:
Number() /*转换为整数或浮点数*/
parseInt() /*转换为整数*/
parseFloat() /*转换为浮点数*/
-
==与===有什么区别?
==和===是比较运算符。比较运算符比较两个值,然后返回一个布尔值,表示是否满足比较条件
==表示相等,不同类型的值进行比较时,会进行类型转换,类型相同后再进行值的比较;
===表示严格相等,数据类型和值都相等时才输出true,其中有一个不相等,则输出false;
false == 0 //ture /*在普通相等下,false是等于0的,false转换后是0*/
false === 0 //false /*在严格相等下,false是不等于0的,因为类型不相等*/
-
break与continue有什么区别?
break和continue多用在循环体中:
break用于强制中断循环体,执行循环体之后的语句;
continue用于中断本次循环,执行下一次循环。示例:
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
break;
}
console.log(i);
} // 1,2,3
for(var i = 1; i< 10; i++){
if(i % 4 === 0){
continue;
}
console.log(i);
} //1,2,3,5,6,7,9
-
void 0 和 undefined在使用场景上有什么区别?
void运算符的作用是执行一个表达式,并返回undefined,区别:
1.在低版本的ie中,undefined可以被重写,影响undefined的使用,void则无此问题;
var undefined = 10;
// undefined *chrome
//10 *IE8
2.void后跟一个表达式,返回的都是 undefined,vodi 0比undefined长度小,且不会被重写。
-
以下代码的输出结果是?为什么?
console.log(1+1); //2
console.log("2"+"4"); //"24"
console.log(2+"4"); //"24"
console.log(+"4"); //4
加法运算符有如下规则:
1.在两个操作数都是数字的时候,会做加法运算;
2.两个参数都是字符串或在有一个参数是字符串的情况下会把另外一个参数转换为字符串做字符串拼接;
3.在参数有对象的情况下会调用其valueOf或toString;
4.在只有一个字符串参数的时候会尝试将其转换为数字;
5.在只有一个数字参数的时候返回其正数值。
-
计算以下代码的输出结果。
var a = 1; //声明一个变量a,a=2;
a+++a; //++的优先级大于+,故先执行a++(a先参与运算再自增),再执行+a,得2;
typeof a+2; //此时a完成自增,在这里a=2,typeof高于加法运算,故最后结果为"number2"
var a = 1; //声明变量a,a=1;
var b = 3; //声明变量b,b=3;
console.log( a+++b ); //++优先级高于+,先参与运算再自增,最后结果为4;
-
遍历数组,打印数组每一项的平方
var arr = [3,4,5];
var arr = [3,4,5]
for(var i = 0;i<3;i++) {
console.log (arr[i]*arr[i])
}
-
遍历 JSON, 打印里面的值。
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (a in obj) {
console.log(a+":"+obj[a])
}
-
计算输出结果。
var a = 1, b = 2, c = 3; //声明a=1,b=2,c=3
var val = typeof a + b || c >0 //优先级:'typeof'>'+'>'>'>'||'>'='
console.log(val) // val = "number2"
//只要“||”前面为false,无论“||”后面是true还是false,结果都返回“||”后面的值。
//只要“||”前面为true,无论“||”后面是true还是false,结果都返回“||”前面的值。
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data) // data = 'bb'
//只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值;
//只要“&&”前面是true,无论“&&”后面是true还是false,结果都返回“&&”后面的值;
var data2 = d = 0 || console.log('haha')
console.log(data2) // data = haha;
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x) //x = 2
//(!"world", !!"from here!!")运算结果为true
//!!"Hello"运算结果为true
//true+true转换类型为1+1,x = 2
*注:主要是运算符的优先级问题。