美文网首页
进阶2 数据类型运算符流程控制语句

进阶2 数据类型运算符流程控制语句

作者: 512a36a11b8c | 来源:发表于2017-11-02 18:51 被阅读78次

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再自增

  1. 遍历数组,把数组里的打印数组每一项的平方
var arr = [3,4,5]
for(i=0;i<arr.length;i++) {
console.log(arr[i]*arr[i])
}
  1. 遍历 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

相关文章

网友评论

      本文标题:进阶2 数据类型运算符流程控制语句

      本文链接:https://www.haomeiwen.com/subject/muvjpxtx.html