JS数据类型运算符流程控制语句
1.JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
JavaScript的数据类型:
- 数值(number):整数和小数
- 字符串(string):字符组成的文本
- 布尔值(boolean):true(真)和false(假)两个特定值
- undefined:表示未定义或者不存在,即此处目前没有任何值
- null:表示空缺。即此处应该有一个值,但目前为空
- 对象(object):各种值组成的集合
-Symbol,ES6新类型,实例唯一且不可改变。
通常,我们将数值、字符串、布尔值称为原始类型(primitive type)的值,即它们是最基本的数据类型,不能再细分了。
而将对象称为合成类型(complex type)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。
至于undefined和null,一般将它们看成两个特殊值。
2.typeof和instanceof的作用和区别?
typeof运算符 与 instanceof运算符 都可以用来确定一个值到底是什么类型
区别:
- typeof运算符可以返回一个值的数据类型,数据类型以字符串表示,可能有以下结果:
由于typeof {} typeof []返回的都是"object",无法区分数组与对象的类型,可以用instanceof运算符可以做到。
typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"
function f() {}
typeof f // "function"
typeof undefined // "undefined"
除此以外,其他情况都返回object。
typeof window // "object"
typeof {} // "object"
typeof [] // "object"
typeof null // "object"
-
instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。
instanceof运算符语法:object(要检测的对象) instanceof constructor(某个构造函数)
例如:
var a=[];
console.log(a instanceof Array); //true
console.log(a instanceof Object); //true
会打印两次true,因为数组对象属于Array类型的同时又属于Object类型。
3. 如何判断一个变量是否是数字、字符串、布尔、函数
var num = 123;
//判断是否number类型
if(typeof num === 'number'){
console.log('is a number');
}
var str = '123';
//判断是否字符串
if(typeof str === 'string'){
console.log('is string');
}
var boo = true;
//判断是否布尔类型
if(typeof boo === 'boolean'){
console.log('is boolean');
}
var fn = function(){};
//判断是否函数
if(typeof fn === 'function'){
console.log('is function');
}
4. NaN是什么? 有什么特别之处?
NaN含义是Not a Number,表示非数字,NaN和任何值都不相等,包括自己
NaN == NaN; //false
5.如何把非数值转化为数值?
有三个函数可以把非数值转换为数值
- Number()
- parseInt()
- parseFloat()
Number规则相当复杂而且不合理,几乎不使用,常用的是后两个,两个规则类似
- 忽略字符串前面的空白字符,找到第一个非空白字符
- 如果第一个字符不是-或者数字返回NaN
- 如果是继续解析,直到非数值模式为止
- 0开头会当做八进制,0x开头会当做十六进制,但是可以指定第二个参数指定基数
parseInt('blue'); //NaN
parseInt('-23ABS'); // -23
parseInt('0xf1'); // 241
parseInt('101', 2); // 5
6.==与===有什么区别
我们知道可以使用==或===判断两个值的相等性,其中区别相信大家清楚,===是严格意义的相等,只需注意NaN和NaN不等就行了。
而使用==的时候,javascript会帮我们做类型转换,造成一些匪夷所思的结果,那么使用==的时候会在哪些情况下做类型转换,又会换成什么样子?
- 如果两个值类型相同,则执行严格相等的运算
- 如果两个值的类型不同
- 如果一个是null,一个是undefined,那么相等
- 如果一个是数字,一个是字符串,先将字符串转为数字,然后比较
- 如果一个值是true/false则将其转为1/0比较
- 如果一个值是对象,一个是数字或字符串,则尝试使用valueOf和toString转换后比较
- 其它就不相等了
null==undefined; //true
NaN==NaN; //false
"1"==true; //true
true == 1; //ture true会转换成number,也就是1
true == 2; //false 当然 1 不等于 2
区别:
- 对于string,number等基础类型,==和===是有区别的
- 不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等
- 同类型比较,直接进行“值”比较,两者结果一样
-
对于Array,Object等高级类型,==和===是没有区别的
进行“指针地址”比较 -
基础类型与高级类型,==和===是有区别的
- 对于==,将高级转化为基础类型,进行“值”比较
- 因为类型不同,===结果为false
7. break与continue有什么区别
区别:
- break 用于强制退出循环体,执行循环后面的语句
- continue 用于退出本次循环,执行下次循环
8.void 0 和 undefined在使用场景上有什么区别
undefined可以被覆盖,如:
(function(){
var undefined = 123,a;
console.log('undefined = ' + undefined);
//此时相当于判断 123 === a,并不是预想中的判断a是否未定义
console.log(undefined == a);
})();
void运算符的作用是执行一个表达式,然后返回undefined
常用作判断变量是否为undefined,可以防止上面undefined被覆盖的情况,如:
if(void 0 === a){}
9. 以下代码的输出结果是?为什么?
image.png//输出数字2,+运算符两端的参数都是number类型,所以是加法运算,输出运算结果2
console.log(1 + 1);
//输出字符串24, +运算符两端的参数都是string类型,所以+的作用是连接两个字符串
console.log("2" + "4");
//输出字符串24,两个参数都是字符串或在有一个参数是字符串的情况下会把另外一个参数转换为字符串做字符串拼接
console.log(2+ "4");
//输出数字4, 在只有一个字符串参数的时候会尝试将其转换为数字
console.log(+"4");
10. 以下代码的输出结果是?
image.png var a = 1;
//输出数字2,++运算符的优先级比+运算符高,相当于(a++)+a,(a++)先运算再赋值,所以a++结束后,a=2,1+2输出3
a+++a;
//输出字符串number2,相当于(typeof a)+2,(typeof a)的值是"number","number"+2的结果是"number2"
typeof a+2;
11.以下代码的输出结果是? 为什么
image.pngvar a = 1;
var b = 3;
//输出数字4,相当于(a++)+b,(a++)的结果是1,b=3,1+3=4,所以输出4
console.log( a+++b );
12.遍历数组,把数组里的打印数组每一项的平方
var arr = [3,4,5];
for(var i=0,len=arr.length; i<len; i++){
console.log(arr[i]*arr[i]);
}
13. 遍历 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
};
for(key in obj){
console.log(obj[key]);
}
14. 以下代码输出结果是? 为什么
image.pngvar a =1, b = 2, c = 3;
var val = typeof a + b || c > 0;
//输出字符串"number2",相当于(typeof a) + b || c > 0, || 运算符优先级最低,所以最后算,typeof a的结果是'number',number + b的结果是'number2',由于||的前一条运算结果是true,所以||后不计算,(typeof a) + b || c > 0返回'number2',然后赋值给val
console.log(val);
image.png
var d = 5;
var data = d ==5 && console.log('bb')
//先输出字符串'bb',后输出undefined, &&优先级较低, d==5 先执行,返回true,所以后面的console.log('bb')会执行,执行后输出'bb'并返回undefined, true && undefined结果是undefined
console.log(data)
image.png
var data2 = d = 0 || console.log('haha');
//先输出字符串"haha",再输出undefined, =运算符优先级最低,所以先执行 0 || console.log("haha"),结果是undefined,得到结果后,再赋值给d与data2
console.log(data2)
image.png
var x = !!"Hello" + (!"world", !!"from here!!");
//输出数字2, !!"Hello"结果是true, (!"world",!!"from here")返回的是!!"from here!!"的结果(结果为true),true + true的结果是2
console.log(x)