數(shù)據(jù)類型運算符流程控制語句

1.JavaScript 定義了幾種數(shù)據(jù)類型? 哪些是原始類型?哪些是復(fù)雜類型?原始類型和復(fù)雜類型的區(qū)別是什么?

JavaScript 定義了7種數(shù)據(jù)類型

  • 6種原始類型
    • boolean :true(真)和false(假)兩個特定值
    • null :表示空缺,即此處應(yīng)該有一個值塔逃,但目前為空
    • undefined :表示“未定義”或不存在,即此處目前沒有任何值
    • string :字符組成的文本(比如"Hello World")
    • number: 整數(shù)和小數(shù)(比如1和3.14)
    • symbol(ECMAScript 6 新定義)
  • object類型即復(fù)雜類型(eg:Object,Array,Function,Data)

區(qū)別:

一料仗、原始類型(基本類型)
  1. 基本數(shù)據(jù)類型的值是不可變的
    var name = "change";
    name.substr();//hang
    console.log(name);//change
  2. 基本數(shù)據(jù)類型不可以添加屬性和方法
    var p = "change";
    p.age = 29;
    p.method = function(){console.log(name)};
    console.log(p.age)//undefined
    console.log(p.method)//undefined
  3. 基本數(shù)據(jù)類型的賦值是簡單賦值
    如果從一個變量向另一個變量賦值基本類型的值湾盗,會在變量對象上創(chuàng)建一個新值,然后把該值復(fù)制到為新變量分配的位置上
    var a = 10;
    var b = a;
    a++;
    console.log(a)//11
    console.log(b)//10
  4. 基本數(shù)據(jù)類型的比較是值的比較
    var person1 = '{}';
    var person2 = '{}';
    console.log(person1 == person2); // true
  5. 基本數(shù)據(jù)類型是存放在棧區(qū)的
    var name = "jozo";var city = "guangzhou";var age = 22;
    那么它的存儲結(jié)構(gòu)如下圖:


二立轧、復(fù)雜類型(引用類型)
1. 引用類型的值是可以改變的
         var a = [1,2,3];
             a[0] = 0;//更改數(shù)組的一個元素
             a[3] = 4;//給數(shù)組增加一個元素
  1. 引用類型可以添加屬性和方法
    var person = {};
    person.name = "change";
    person.say = function(){alert("hello");}
    console.log(person.name)//change
    console.log(person.say)//function(){alert("hello");}
  2. 引用類型的賦值是對象引用
    var a = {};
    var b= a;
    a.name = "change";
    console.log(a.name)//change;
    console.log(b.name)//change
    b.age = 29;
    console.log(a.age)//29
    console.log(b.age)//29
    引用類型保存在變量中的是對象在堆內(nèi)存中的地址格粪,所以,與基本數(shù)據(jù)類型的簡單賦值不同氛改,這個值的副本實際上是一個指針帐萎,而這個指針指向存儲在堆內(nèi)存的一個對象.那么賦值操作后,兩個變量都保存了同一個對象地址胜卤,而這兩個地址指向了同一個對象.因此疆导,改變其中任何一個變量,都會互相影響


  3. 引用類型的比較是引用的比較
    var person1 = {};
    var person2 = {};
    console.log(person1 == person2)//false
    因為引用類型的比較是引用的比較葛躏,換句話說澈段,就是比較兩個對象保存在棧區(qū)的指向堆內(nèi)存的地址是否相同,此時舰攒,雖然p1和p2看起來都是一個"{}"败富,但是他們保存在棧區(qū)中的指向堆內(nèi)存的地址卻是不同的,所以兩個對象不相等


  4. 引用類型是同時保存在棧區(qū)和堆區(qū)中的
    var person1 = {name:"change1"};
    var person2 = {name:"change2"};
    var person3 = {name:"change3"};
    則這三個對象在內(nèi)存中保存的情況如下圖:


2.typeof和instanceof的作用和區(qū)別?

1.typeof操作符是確定一個變量是字符串摩窃、數(shù)值兽叮、布爾、還是undefined的最佳工具猾愿,但在檢測引用類型的值時鹦聪,這個操作符的用處不大。

類型 結(jié)果
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
任何其他對象 "object"

2.instanceof運算符用來測試一個對象在其原型鏈中是否存在一個構(gòu)造函數(shù)的 prototype 屬性匪蟀,即用來知道是什么類型的對象椎麦。
person instanceof Object //person是Object嗎
function C(){}
function D(){}
var o = new C(); o instanceof C;// true,因為 Object.getPrototypeOf(o) === C.prototype var a=[]; a instanceof Array;//true

3.如何判斷一個變量是否是數(shù)字材彪、字符串观挎、布爾、函數(shù)

使用typeof判斷


4.NaN是什么? 有什么特別之處?

NaN是JavaScript的特殊值段化,表示“非數(shù)字”(Not a Number)
特點:
1.NaN不是數(shù)字嘁捷,但是它的數(shù)據(jù)類型是數(shù)字
typeof NaN; //number
2.NaN是JavaScript之中唯一不等于自身的值,不等于任何值显熏,包括它本身
NaN == NaN; //false NaN === NaN; //false
3.NaN在布爾運算時被當作false
Boolean(NaN); //false
4.NaN與任何數(shù)(包括它自己)的運算雄嚣,得到的都是NaN
NaN + 32 //NaN NaN - 32 //NaN NaN * 32 //NaN NaN / 32 //NaN
5.判斷NaN的方法
isNaN()原理:isNaN()會將括號內(nèi)的參數(shù)利用Number()進行一次轉(zhuǎn)換.
由于會對參數(shù)用Number()進行一次數(shù)據(jù)轉(zhuǎn)換,故對于字符串、部分對象缓升、部分數(shù)組鼓鲁、undefined等,isNaN()會返回true
isNaN('NaN'); //true 等同于isNaN(Number('NaN')); isNaN({}); //true 等同于isNaN(Number({})); isNaN(['xzy']); //true 等同于isNaN(Number(['xzy'])); isNaN(undefined); //true 等同于isNaN(Number(undefined)); Number(undefined)的結(jié)果為NaN
但是港谊,對于空數(shù)組骇吭、只有一個數(shù)值成員的數(shù)組、null等歧寺,isNaN()返回false
isNaN([]); //false isNaN([123]); //false isNaN(['123']); //false isNaN(null); //false Number(null)的結(jié)果為0

5.如何把非數(shù)值轉(zhuǎn)化為數(shù)值?

javascript有3個函數(shù)可以把非數(shù)值轉(zhuǎn)換為數(shù)值:Number()燥狰、parseInt()、parseFloat()斜筐。
Number()可以用于任何數(shù)據(jù)類型(此函數(shù)平時很少使用)龙致。
parseInt()、parseFloat()專門用于把字符串轉(zhuǎn)換成數(shù)值(比較常用的)顷链。

  • parseInt(string, radix):識別整數(shù)格式目代。
    如果字符串中的第一個字符是數(shù)字字符,parselnt() 也能夠識別出各種整數(shù)格式(即前面討論的十進制嗤练、八進制和十六進制數(shù)) 像啼。也就是說,如果字符以"0x"開頭且后跟數(shù)字字符潭苞,就會將其當作一個十六進制整數(shù)忽冻;如果字符串以"0"開頭且后跟數(shù)字字符,則會將其當作一個八迸制數(shù)來解析此疹。
    var num1 = parselnt ("1234blue") ; // 1234 var num2 = parselnt (" ") ; // NaN var num3 = parselnt ("0xA") ; // 10(十六進制數(shù)) var num4 = parseInt(22.5); // 22 var num5 = parselnt ("070") ; // 56(八進制數(shù)) var num6 = parselnt("70"); //70(十進制數(shù)) var num7 = parselnt ("0xf") ; // 15(十六進制數(shù))
  • parseFloat() :識別浮點僧诚,且第一個浮點有效
    var num1 = parseFloat ("1234blue") ; // 1234(整數(shù)) 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
  • Number()轉(zhuǎn)換規(guī)則:
    1.如果是 Boolean 值,true 和 false 將分別被轉(zhuǎn)換為 1 和0蝗碎;Number(true) //1
    2.如果是數(shù)字值湖笨,只是簡單的傳入和返回;
    Number(12) //12
    3.如來是null 值蹦骑,返回 0慈省;
    Number(null) //0
    4.如果是 undefined,返回NaN 眠菇;
    Number(undefined)//NaN
    5.如果是字符串边败,遵循下列規(guī)則:
    a.如果字符串中只包含數(shù)字,則將其轉(zhuǎn)換為十進制數(shù)值捎废,即"1"會變成1 笑窜, "123"會變成123,而"011"會變成11(注意登疗,前導(dǎo)的0被忽略了)排截;
    b.如果字符串中包含有效的浮點格式嫌蚤, 如"1.1",則將其轉(zhuǎn)換為對應(yīng)的c.浮點數(shù)值(同樣断傲,也會忽略前導(dǎo)零)脱吱;
    d.如果字符串中包含有效的十六進制格式,例如"0xf"认罩,則將其轉(zhuǎn)換為相同大小的十進制整數(shù)值急凰;
    Number(0xf)//15
    e如果字符串是空的(不包含任何字符) ,則將其轉(zhuǎn)換為0猜年;
    Number("")//0
    f.如果字符串中包含除上述格式之外的字符,則將其轉(zhuǎn)換為 NaN疾忍。
    g.如果是對象乔外,則調(diào)用對象的 valueOf() 方法,然后依照前面的規(guī)則轉(zhuǎn)換返回的值一罩。如果轉(zhuǎn)換的結(jié)果是 NaN杨幼,則調(diào)用對象的 toString() 方法,然后再次依照前面的規(guī)則轉(zhuǎn)換返回的字符串值

6.==與===有什么區(qū)別

==:等于運算(值的比較)聂渊,但是不比較值的類型差购, 兩邊值類型不同的時候,要先進行類型轉(zhuǎn)換汉嗽,再比較欲逃。
===:完全等于運算(值和類型的比較),不僅比較值饼暑,而且還比較值的類型稳析,當兩邊類型不一致時,不做類型轉(zhuǎn)換弓叛,類型不同的一定不等彰居,只有兩者一致才為真。

7.break與continue有什么區(qū)別

  • Break 語句:用于跳出循環(huán)撰筷。
    break 語句跳出循環(huán)后陈惰,會繼續(xù)執(zhí)行該循環(huán)之后的代碼(如果有的話)
    for(var i = 1; i< 10; i++){
    if(i % 4 === 0){
    break;
    }
    console.log(i); // 1 2 3
    }
  • Continue 語句
    continue 語句中斷循環(huán)中的迭代,如果出現(xiàn)了指定的條件毕籽,然后繼續(xù)循環(huán)中的下一個迭代抬闯。
    for(var i = 1; i<6; i++){
    if(i % 4 === 0){
    continue;
    }
    console.log(i);//1 2 3 5
    }

8.void 0 和 undefined在使用場景上有什么區(qū)別

void 會執(zhí)行后面的表達式并返回 undefined,但是某些情境下undefined是可以被賦值的关筒,比如在函數(shù)中画髓,這樣的話就不能用undefined來進行判斷了。所以用void 0返回undefined來進行判斷平委。既減少了在原形鏈上查找 window.undefined 的時間奈虾,也避免了誤用被修改過的 undefined。

9.以下代碼的輸出結(jié)果是?為什么?

console.log(1+1); // 返回 2同為number類型相加,返回正常運算 console.log("2"+"4"); //返回24 ,字符串拼接 console.log(2+"4"); //返回24 ,number 和字符串相加肉微,number轉(zhuǎn)為字符串 console.log(+"4");//返回4 ,只有一個字符串會轉(zhuǎn)換成數(shù)字輸出

10. 以下代碼的輸出結(jié)果是?

var a = 1; a+++a; //返回3匾鸥;(a++)+a=> 1 +2=3; typeof a+2;//返回number2,typeof優(yōu)先級最高 (typeof a)+2=> number2

11. 以下代碼的輸出結(jié)果是? 為什么

var a = 1; var b = 3; console.log( a+++b );//返回4碉纳,(a++)+b=>1+3=4;

12. 遍歷數(shù)組勿负,把數(shù)組里的打印數(shù)組每一項的平方

var arr = [3,4,5]
var arr = [3,4,5]; //方法一 for(var i=0;i<arr.length;i++){ console.log(arr[i]+"的平方是"+Math.pow(arr[i],2)) } //方法二 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(key in obj){ console.log(obj[key]) }

14. 以下代碼輸出結(jié)果是? 為什么 (選做題目)

var a = 1, b = 2, c = 3;
 var val = typeof a + b || c >0
 console.log(val)//number2 ``
 expr1 ||  expr2: 短路邏輯,如果expr1為``true`` ,返回expr1;
 以上運算中  Boolean(typeof a + b)=>Boolean("number2") 為true ,所以返回number2

`

var d = 5;
  var data = d ==5 && console.log('bb')
  console.log(data)//返回undefined``
  expr1 &&  expr2: 短路邏輯,如果expr1為``false ``,返回expr1;
  d ==5 為true劳曹,所以返回 console.log('bb')
  但是最后一步console.log(console.log('bb'))  返回 undefined 
  原因:內(nèi)部的console.log()為console對象內(nèi)的log方法奴愉,但是沒有返回值
 例如:
var obj={
log:function log () {   }
  }
console.log(obj.log() )//undefined
var obj={
  log:function log () {  return "123"   }
}
console.log(obj.log() )//123

`

 var data2 = d = 0 || console.log('haha')
  console.log(data2)//返回 undefined
邏輯或的短路邏輯,Boolean(0) 為false,所以返回后者console.log('haha')
最后一步console.log(console.log('haha'))返回undefined铁孵;原因:內(nèi)層console.log(‘haha’)方法沒有返回值

`

  var x = !!"Hello" + (!"world", !!"from here!!");
      console.log(x)//2``
    !expr   如果單個表達式能轉(zhuǎn)換為true的話返回false,否則返回true.
    1. (!"world", !!"from here!!")  逗號操作符返回返回表達式的最后一項   !!"from here!!" =>true;
    2. !!"Hello"=>true 
    true + true =2;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锭硼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜕劝,更是在濱河造成了極大的恐慌檀头,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岖沛,死亡現(xiàn)場離奇詭異暑始,居然都是意外死亡,警方通過查閱死者的電腦和手機婴削,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門廊镜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唉俗,你說我怎么就攤上這事期升。” “怎么了互躬?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵播赁,是天一觀的道長。 經(jīng)常有香客問我吼渡,道長容为,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任寺酪,我火速辦了婚禮坎背,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘寄雀。我一直安慰自己得滤,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布盒犹。 她就那樣靜靜地躺著懂更,像睡著了一般眨业。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沮协,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天龄捡,我揣著相機與錄音,去河邊找鬼慷暂。 笑死聘殖,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的行瑞。 我是一名探鬼主播奸腺,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼血久!你這毒婦竟也來了突照?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤洋魂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后喜鼓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體副砍,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年庄岖,在試婚紗的時候發(fā)現(xiàn)自己被綠了豁翎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡隅忿,死狀恐怖心剥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情背桐,我是刑警寧澤优烧,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站链峭,受9級特大地震影響畦娄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弊仪,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一熙卡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧励饵,春花似錦驳癌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽表窘。三九已至,卻和暖如春灾杰,著一層夾襖步出監(jiān)牢的瞬間蚊丐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工艳吠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留麦备,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓昭娩,卻偏偏與公主長得像凛篙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子栏渺,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容