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

1. JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
最新的 ECMAScript 标准定义了 7 种数据类型: 6 种 原始类型: Boolean, Null, Undefined, Number, String, Symbol (ECMAScript 6 新定义) 和 Object

数值、字符串、布尔值称为原始类型(primitive type),是最基本的数据类型
Object称为复杂数据类型(complex type)的值,因为一个对象往往是多个原始数据类型的值的合成,可以看作是一个存放各种值的容器。
Undefined和null,是两个特殊的值。
2. typeof和instanceof的作用和区别?

  • typeof一元运算符,用来返回操作数类型的字符串。
    typeof几乎不可能得到它们想要的结果。typeof只有一个实际应用场景,就是用来检测一个对象是否已经定义或者是否已经赋值。而这个应用却不是来检查对象的类型。
  • instanceof 左操作数是一个类,右操作数是标识对象的类。如果左侧的对象是右侧类的实例,则返回true.而js中对象的类是通过初始化它们的构造函数来定义的。即instanceof的右操作数应当是一个函数。所有的对象都是object的实例。如果左操作数不是对象,则返回false,如果右操作数不是函数,则抛出typeError。instanceof 运算符是用来测试一个对象是否在其原型链原型构造函数的属性。instanceof 操作符用来比较两个操作数的构造函数。只有在比较自定义的对象时才有意义。 如果用来比较内置类型,将会和 typeof 操作符 一样用处不大。

分别是什么时候用?
对自定义类型使用instanceof:

var ClassFirst = function () {};
var ClassSecond = function () {};
var instance = new ClassFirst();
typeof instance; // object
typeof instance == 'ClassFirst'; //false
instance instanceof Object; //true
instance instanceof ClassFirst; //true
instance instanceof ClassSecond; //false

使用typeof为简单的内置类型:

'example string' instanceof String; // false
typeof 'example string' == 'string'; //true

'example string' instanceof Object; //false
typeof 'example string' == 'object'; //false

true instanceof Boolean; // false
typeof true == 'boolean'; //true

99.99 instanceof Number; // false
typeof 99.99 == 'number'; //true

function() {} instanceof Function; //true
typeof function() {} == 'function'; //true

对于复杂的内置类型使用instanceof:

/regularexpression/ instanceof RegExp; // true
typeof /regularexpression/; //object

[] instanceof Array; // true
typeof []; //object

{} instanceof Object; // true
typeof {}; //object

3. 如何判断一个变量是否是数字、字符串、布尔、函数
使用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';

4. NaN是什么? 有什么特别之处?
NaN 是一个全局对象的属性,表示非数字,NaN和任何值都不相等,包括自己。
NaN==NaN;//false
NaN 属性的初始值就是 NaN,和 Number.NaN 的值一样。在现代浏览器中(ES5中), NaN 属性是一个不可配置(non-configurable),不可写(non-writable)的属性。但在ES3中,这个属性的值是可以被更改的,但是也应该避免覆盖。
5. 如何把非数值转化为数值?
Number() 、parselnt() 和 parseFloat()可以把非数值转换为数值。

Number():
var num1 = Number("Hello world!");  // NaN
var num2 = Number(" ");  // 0
var num3 = Numberl("000011");  // 11
var num4 = Number(true);  // 1
parseInt():
var num1 = parselnt ("1234blue") ;  // 1234
var num2 = parselnt (" ") ;   // NaN
var num3 = parselnt ("0xA") ;  // 10(十六进制数)
var num4 = parseInt(22.5);   // 22
var num5 = parselnt ("070") ;  // 56(八进制数)
var num6 = parselnt("70");  //70(十进制数)
var num7 = parselnt ("0xf") ;  // 15(十六进制数)
var num1 = parselnt ("10", 2);  // 2(按照二进制解析)
var num2 = parseInt("10", 8);  // 8(按照八进制解析)
var num3 = parselnt("10", 10);  // 10(按照十进制解析)
var num4 = parselnt("10", 16);  // 16(按照十六进制解析)
parseFloat():
var num1 = parseFloat ("1234blue") ;  // 1234(整数)
var num2 = parseFloat("0xA");   // 0
var num3 = parseFloat("22.5");  // 22.5
var num4 = parseFloat("22.34.5");  // 22.5
var num5 = parseFloat("0908.5");   // 908
var num6 = parseFloat("3.125e7");   // 31250000

6. ==与===有什么区别
绝大多数场合应该使用 === ,只有检测 null/undefined 的时候可以使用 x == null ,因为通常我们不区分 null 和 undefined ,即将 x == null 作为 x === null || x === undefined 的缩写。== 的比较看似会比较方便,比如 1 == '1' ,但是会埋下隐患,比如可能对类型做出错误的假设。例子:if (x == 10) x += 5如果传入的x是字符串'10',x的结果会变成'105'。在后续运算中字符串'105'又可能被转型,从而引入隐蔽的错误。
1、对于string,number等基础类型,==和===是有区别的1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等2)同类型比较,直接进行“值”比较,两者结果一样
2、对于Array,Object等高级类型,==和===是没有区别的进行“指针地址”比较
7. break与continue有什么区别
break用于强制退出循环体,执行循环后面的语句。
continue用于退出本次循环,执行下次循环。
8. void 0 和 undefined在使用场景上有什么区别
mdn上对void操作符的解释是
The void operator evaluates the given expression and then returns undefined.
意思是说 void 运算符能对给定的表达式进行求值,然后返回 undefined。也就是说,void 后面你随便跟上一个表达式,返回的都是 undefined,都能完美代替 undefined!那么,这其中最短的是什么呢?毫无疑问就是 void 0 了。其实用 void 1,void (1+1),void (0) 或者 void “hello”,void (new Date()) 等等,都是一样的效果。更重要的前提是,void 是不能被重写的(cannot be overidden)。不使用undefined是因为undefined 并不是保留词(reserved word),它只是全局对象的一个属性,在低版本 IE 中能被重写
9. 以下代码的输出结果是?
console.log(1+1); console.log("2"+"4"); console.log(2+"4"); console.log(+"4");
2 “24” “24” 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++)+b,此时(a++)的值为1,b为3,相加就是4
12. 遍历数组,把数组里的打印数组每一项的平方
var arr = [3,4,5]

for (var i = 0; i < arr.length; i++) {
   console.log(arr[i] = arr[i] * arr[i])
}

13. 遍历 JSON, 打印里面的值
var obj = { name: 'hunger', sex: 'male', age: 28 }

for (var i in obj) {
  console.log(obj[i]);
}

14. 以下代码的输出结果是? 为什么

var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)   
//结果为number2,运算过程是(typeof a)+b,||是或运算符

var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)  
//结果为undefined,"="的优先级最低,所以直接运行console.log('bb')。

var data2 = d = 0 || console.log('haha')
console.log(data2)
//结果为undefined,这里是或运算符||

var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
//结果为2,!!是强制转换成布尔类型,!!"Hello" === true == 1,(!"world", !!"from here!!")运算的后的结果为(false,true),所以就是(0,1),返回结果为1,x这时就为1+1=2
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容