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

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/typeof

1.JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?

JavaScript语言的每一个值,都属于某一种数据类型。JavaScript的数据类型,共有六种。
数值(number):整数和小数(比如1和3.14)
字符串(string):字符组成的文本(比如"Hello World")
布尔值(boolean):true(真)和false(假)两个特定值
undefined:表示“未定义”或不存在,即此处目前没有任何值
null:表示空缺,即此处应该有一个值,但目前为空
对象(object):各种值组成的集合

example:

var str = 'jirengu';
var isOk = true ;
var hello;  //undefined
var empty = null; 
var person = {
  name: '小明',
  age: 100
}
var arr = [1, 2, 3];
var sayName = function(){
  console.log('my name is jirengu')
}
var reg = /hello/;```

原始类型(primitive type):包含数值、字符串、布尔值。
复杂类型(complex type):对象

两者的区别:
原始类型(primitive type),即它们是最基本的数据类型,不能再细分了。
而复杂类型(complex type)(引用类型)的值,因为一个对象往往是多个原始类型的值的合成,可以看作是一个存放各种值的容器。
至于undefined和null,一般将它们看成两个特殊值。
typeof  null
object

####2.typeof和instanceof的作用和区别?

- typeof的作用:typeof是一元运算符,返回值为字符串,该字符串用来说明运算数的数据类型。而这个应用却不是来检查对象的类型。

- instanceof的作用:instanceof用于判断某个变量是否是某个对象的实例,返回值为true或false。其语法是object instanceof constructor。

- 区别:因为typeof遇到数组、null都会返回object,所以要判断某个对象是否是数组或者某个变量是否是对象的实例时就要使用instanceof。

```var o = {};
var a = [];
o instanceof Array // false
a instanceof Array // true```

####3.如何判断一个变量是否是数字、字符串、布尔、函数
三种方法:

方法一:typeof运算符
typeof运算符可以返回一个值的数据类型。返回值为number时是数字;返回值为string时是字符串;返回值为boolean时是布尔;返回值是function时是函数。
原始类型:数值、字符串、布尔值分别返回number、string、boolean。
```typeof 123 // "number"
typeof '123' // "string"
typeof false // "boolean"```
函数:函数返回function。
```function f() {}
typeof f
// "function"```

undefined:返回undefined。
```typeof undefined
// "undefined"```
除此以外,其他情况都返回object。

方法二:instanceof运算符
方法三:Object.prototype.toString方法
Object.prototype.toString.call()

####4.NaN是什么? 有什么特别之处?
NaN(Not a Number)表示非数字,NaN和任何值都不相等,包括自己。
`parseInt('abc'); //NaN`
0除以0也会得到NaN。`0 / 0 // NaN`
需要注意的是,NaN不是一种独立的数据类型,而是一种特殊数值,它的数据类型依然属于Number,使用typeof运算符可以看得很清楚。`typeof NaN // 'number'`
特别之处是:
任何NaN的值进行操作都会返回一个NaN
NaN与任何值都不相等包括它自己
```NaN == NaN; //false
NaN !== NaN; //true```

####5.如何把非数值转化为数值?
有三个函数可以把非数值转换为数值:

1. Number()
Number() 函数把对象的值转换为数字。
语法:Number(object)
如果参数是 Date 对象,Number() 返回从 1970 年 1 月 1 日至今的毫秒数。
如果对象的值无法转换为数字,那么 Number() 函数返回 NaN。

2. parseInt()
parseInt方法用于将字符串转为整数。parseInt的返回值只有两种可能,不是一个十进制整数,就是NaN。
忽略字符串前面的空白字符,找到第一个非空白字符;
如果第一个字符不是-或者数字返回NaN;
如果是继续解析,直到非数值模式为止;
parseInt方法还可以接受第二个参数(2到36之间),表示被解析的值的进制,返回该值对应的十进制数。默认情况下,parseInt的第二个参数为10,即默认是十进制转十进制。
```parseInt('1000') // 1000
// 等同于
parseInt('1000', 10) // 1000```
0开头会当做八进制,0x开头会当做十六进制,但是可以指定第二个参数指定基数;
```parseInt('blue'); //NaN
parseInt('-23ABS'); // -23
parseInt('0xf1'); // 241
parseInt('101', 2); // 5```

3. parseFloat()
parseFloat方法用于将一个字符串转为浮点数。如果字符串符合科学计数法,则会进行相应的转换。
如果字符串包含不能转为浮点数的字符,则不再进行往后转换,返回已经转好的部分。
如果参数不是字符串,或者字符串的第一个字符不能转化为浮点数,则返回NaN。
parseFloat会将空字符串转为NaN。`parseFloat('') // NaN `
这些特点使得parseFloat的转换结果不同于Number函数。
```parseFloat(true)  // NaN
Number(true) // 1
parseFloat(null) // NaN
Number(null) // 0
parseFloat('') // NaN
Number('') // 0
parseFloat('123.45#') // 123.45
Number('123.45#') // NaN```

####6.==与===有什么区别
- ==(equality 等同)两边值类型不同的时候,要先进行类型转换,再比较。 
如果两个值类型相同,则执行严格相等的运算。
如果两个值的类型不同:
如果一个是null,一个是undefined,那么相等;
如果一个是数字,一个是字符串,先将字符串转为数字,然后比较;
如果一个值是true/false则将其转为1/0比较;
如果一个值是对象,一个是数字或字符串,则尝试使用valueOf和toString转换后比较;
其它就不相等了。
```null==undefined;
NaN==NaN
"1"==true```

- ===(identity 恒等)是严格意义的相等,不做类型转换,类型不同的一定不等。 需注意NaN和NaN不等。

####7.break与continue有什么区别
- break 用于强制退出循环体,执行循环后面的语句。
- continue 用于退出本次循环,执行下次循环。

```for(var i = 1; i< 10; i++){
    if(i % 4 === 0){
        break;
    }
    console.log(i);
}```
输出结果为1 2 3 ,当i=4时,执行if语句,遇到break会跳出整个循环,结束。

```for(var i = 1; i< 10; i++){
    if(i % 4 === 0){
        continue;
    }
    console.log(i);
}```
输出结果为1 2 3 5 6 7 8 9,当i=4时,执行if语句,遇到continue会接着循环,当i=10时才结束。

####8.void 0 和 undefined在使用场景上有什么区别
- undefined 不能被重写。但是在局部作用域中,还是可以被重写的,所以undefined现常用于全局环境。
- void 运算符通常只用于获取 undefined 的原始值,一般使用 void(0),在上述情况中,也可以使用全局变量undefined 来代替(假定其仍是默认值)。
而 void 可以给任何给定的表达式求值,并返回 undefined,并且 void 不能被重写,因此void 0是在局部作用域中替代undefined的最佳选择。

####9.以下代码的输出结果是?为什么?
```console.log(1+1);//2 两个值都为number故直接计算结果为2
console.log("2"+"4"); //24 "2"与"4"都为字符串,相加的结果也是字符串"24"
console.log(2+"4"); //24 "4"为字符串,2则转换为字符串才能相加,结果为"24"
console.log(+"4");//4 只有一个字符串会转换成数字输出,4```

####10. 以下代码的输出结果是?
```var a = 1;  
a+++a;//3 ++的优先级大于+,先执行a++,a++为1,a的值变为2,故a++加上a的值为3  
typeof a+2;//number2```

typeof的优先级高于+,故顺序为(typeof a)+2,typeof a的结果为number,number+2的结果为字符串number2

####11. 以下代码的输出结果是? 为什么
 ```var a = 1;
 var b = 3;
 console.log( a+++b );//4```
++的优先级高于+,故顺序为(a++)+b,a++为1,b为3,故结果为4

####12. 遍历数组,把数组里的打印数组每一项的平方
 ```var arr = [3,4,5]
    for(i=0;i<arr.length;i++){console.log(arr[i]*arr[i])}```


####13. 遍历 JSON, 打印里面的值
```var obj = {
 name: 'hunger', 
 sex: 'male', 
 age: 28 
}
for(var prop in obj){
    console.log(prop);
}```

####14. 以下代码输出结果是? 为什么 (选做题目)
```var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val) //number2```

按照优先级,首先是typeof a为number
number+b,b的值为2,故结果为字符串number2
c>0为true,最后number2 || true为number2

```var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)//bb```

按照优先级,console.log('bb')为bb,d==5为true
true&&bb为bb,赋值给data

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

推荐阅读更多精彩内容