进阶2 数据类型运算符流程控制语句
1. JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbol 类型的值)
数值(number):整数和小数(比如1和3.14)
字符串(string):字符组成的文本(比如”Hello World”)
布尔值(boolean):true(真)和false(假)两个特定值
undefined:表示“未定义”或不存在,即由于目前没有定义,所以此处暂时没有任何值
null:表示无值,即此处的值就是“无”的状态。
对象(object):各种值组成的集合
通常,我们Boolean,Null,Undefined,Number,String,Symbol (ECMAScript 6 新定义)称为原始类型(primitive type)的值,即它们是最基本的数据类型,不能再细分了。Object为复杂类型
2. typeof和instanceof的作用和区别?
typeof操作符返回一个字符串,指示未经计算的操作数的类型。
// Numbers
typeof 37 === 'number';
typeof 3.14 === 'number';
typeof Math.LN2 === 'number';
typeof Infinity === 'number';
typeof NaN === 'number'; // 尽管NaN是"Not-A-Number"的缩写
typeof Number(1) === 'number'; // 但不要使用这种形式!
// Strings
typeof "" === 'string';
typeof "bla" === 'string';
typeof (typeof 1) === 'string'; // typeof总是返回一个字符串
typeof String("abc") === 'string'; // 但不要使用这种形式!
// Booleans
typeof true === 'boolean';
typeof false === 'boolean';
typeof Boolean(true) === 'boolean'; // 但不要使用这种形式!
// Symbols
typeof Symbol() === 'symbol';
typeof Symbol('foo') === 'symbol';
typeof Symbol.iterator === 'symbol';
// Undefined
typeof undefined === 'undefined';
typeof declaredButUndefinedVariable === 'undefined';
typeof undeclaredVariable === 'undefined';
// Objects
typeof {a:1} === 'object';
// 使用Array.isArray 或者 Object.prototype.toString.call
// 区分数组,普通对象
typeof [1, 2, 4] === 'object';
typeof new Date() === 'object';
// 下面的容易令人迷惑,不要使用!
typeof new Boolean(true) === 'object';
typeof new Number(1) ==== 'object';
typeof new String("abc") === 'object';
// 函数
typeof function(){} === 'function';
typeof Math.sin === 'function';
instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。用来检测 constructor.prototype 是否存在于参数 object 的原型链上。
var simpleStr = "This is a simple string";
var myString = new String();
var newStr = new String("String created with constructor");
var myDate = new Date();
var myObj = {};
simpleStr instanceof String; // returns false, 检查原型链会找到 undefined
myString instanceof String; // returns true
newStr instanceof String; // returns true
myString instanceof Object; // returns true
myObj instanceof Object; // returns true, despite an undefined prototype
({}) instanceof Object; // returns true, 同上
myString instanceof Date; // returns false
myDate instanceof Date; // returns true
myDate instanceof Object; // returns true
myDate instanceof String; // returns false
补充 Object.prototype.toString:
为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式来调用,把需要检测的对象作为第一个参数传入。
var toString = Object.prototype.toString;
toString.call(new Date); // [object Date]
toString.call(new String); // [object String]
toString.call(Math); // [object Math]
//Since JavaScript 1.8.5
toString.call(undefined); // [object Undefined]
toString.call(null); // [object Null]
3. 如何判断一个变量是否是数字、字符串、布尔、函数
typeof 123 === 'number' //判断是否为数字
typeof '123' === 'string' //判断是否为字符串
typeof true === 'boolean' //判断是否为布尔值
typeof fn === 'function' //判断是否为函数
4. NaN是什么? 有什么特别之处?
NaN:Not a Number,表示非数字,NaN和任何值都不相等,包括自己。
当算术计算后,计算结果无法转化为JS可显示的数字类型或是结果无法转换成数字类型时,返回NaN
5. 如何把非数值转化为数值?
利用这三个函数:Number();parseInt();parseFloat()
6. ==与===有什么区别
===:是严格意义的相等,比较是否为同一值,数据类型不同时,不相等,直接返回false。注意NaN和NaN不等。
==:当数据类型不同时javascript会做类型转换,再比较。
7. break与continue有什么区别
break 用于强制退出循环体,执行循环后面的语句
continue 用于退出本次循环,执行下次循环
8. void 0 和 undefined在使用场景上有什么区别
- void运算符作用是执行一行表达式,并返回undefined,所以void 0或者是其它任何表达式返回就是undefined.
- undefined是一个未定义,正常返回也是undefined如果当undefined被赋值了,他返回虽然还是undefined,但是这个被赋值的undefined就不全等于undefined了。
void(0)
这个运算符能向期望一个表达式的值是undefined的地方插入会产生副作用的表达式。
void 运算符通常只用于获取 undefined 的原始值,一般使用 void(0)(等同于 void 0)。在上述情况中,也可以使用全局变量undefined 来代替(假定其仍是默认值)。
9. 以下代码的输出结果是?为什么?
console.log(1+1); 输出2是数字,数字相加
console.log("2"+"4"); 输出24是字符串,字符串拼接
console.log(2+"4"); 输出24是字符串,2转化为字符串,然后拼接
console.log(+"4"); 输出4,是数字
10. 以下代码的输出结果是?
var a = 1;
a+++a;
typeof a+2;
number2
11. 以下代码的输出结果是? 为什么
var a = 1;
var b = 3;
console.log( a+++b );
4 ,自增的权重大于加号所以等于 (a++)+b, a++表示a先参加运算后自增,所以先计算a+b=4,a再自增
- 遍历数组,把数组里的打印数组每一项的平方
var arr = [3,4,5]
for(i=0;i<arr.length;i++) {
console.log(arr[i]*arr[i])
}
- 遍历 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (var prop in obj) {
console.log(prop +':' +obj[prop])
}
14. 以下代码输出结果是? 为什么 (选做题目)
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
//输出number2; 先运算 typeof a 得到number ;在运算 c>0 得到true; b||true 得到2;最相加得到number2
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
//输出:bb undefined ; console.log('bb')先执行输出bb,&&符合前ture,console.log('bb')返回undefined,所以data为undefined
var data2 = d = 0 || console.log('haha')
console.log(data2)
//输出:haha undefined ;console.log('haha')先执行输出haha, 0和console.log('haha')或运算输出undefined,
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
//输出:2 !"world"为false, !!"from here!!"为ture, !!"Hello"为ture,所以为ture+ture, 输出为2