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

JavaScript 的数据类型

  • JavaScript语言的每一个值,都属于某一种数据类型。JavaScript的数据类型共有6种。
    • 数值(number):整数和小数
    • 字符串(string):字符组成的文本(例如:"Hello World")
    • 布尔值(boolean):true(真)和false(假)两个特定值
    • undefined:表示“未定义”或不存在,即此处目前没有任何值
    • null:表示空缺,即此处应有一个值,但目前为空
    • 对象(object):各种值组成的集合
  • 原始类型
    number、string、boolean称为原始类型的值,即他们是最基本的数据类型,不能在细分。
  • 复杂类型
    对象(object)则被称为复杂类型,因为一个对象往往是多个原始类型值的合成,可以看作是一个存放各种值的容器。其可以细分成Object 类型、Array 类型、Date 类型、RegExp 类型、Function 类型等。
  • 二者区别
    • 原始类型:
      a.最基本的数据类型,不能再细分,数据存放在栈内存里。
      b.基本类型的比较是值的比较。
      c.变量存放在栈内存(stack)里。
    • 复杂类型:
      a.一个对象往往是多个原始类型值的合成,是一组数据和功能的集合。
      b.引用类型的比较是引用的比较。
      c.数据同时存放在栈内存和堆内存里,栈内存中保存了变量标识符和指向内存中该对象的指针,堆内存中保存了对象的内容。

typeof和instanceof的作用与区别

  • typeof用于基本数据类型的类型判断,返回值都为小写的字符串。如果是对象,除了function类型会返回“function”, 其他对象统一返回“object”。
typeof  123  \\ number
typeof  "abc"  \\ string
typeof  false  \\ boolean
function  f( ) { }
typeof  f  \\ funtcion
typeof  { }  \\ object
typeof  null  \\ object
typeof  undefined  \\ undefined

typeof应该注意的问题:
使用typeof操作符的时候,如果检测对象是函数,那么操作符返回"function" 。如果检测对象是正则表达式的时候,在Safari和Chrome中使用typeof的时候会错误的返回"function",其他的浏览器返回的是object。

  • instanceof 利用原型链继承关系做判断,它针对对象类型(语法:对象 instanceof 构造函数)
var o = { };
var a = { };
o instanceof Array // false
a instanceof Array // true
>   [1,2,3] instanceof Array
<  ture
>  var obj = { }
<  undefined
>  obj instanseof Array
<  false
  • 区别
    • typeof是判断变量是什么基本类型的
    • instanceof是判断对象到底是什么类型的
  • typeof undefined 范例
    eg:
    没有声明a、b时,
>  a+b
报错;
然而
>  typeof  b
<  "undefined"
**利用这一点,typeof可以用来检查一个没有声明的变量,而不报错**

实际编程中,这个特点通常用在判断语句:

//  错误的写法
if  (v) { }    //报错

//  正确的写法
if  (typeof v === "undefined") { }
不管 v 是否存在,都不报错

如何判断一个变量是否是数字、字符串、布尔、函数

使用typeof,看返回值

NaN

NaN含义是Not a Number,表示非数字,NaN和任何值都不相等,包括自己。

NaN == NaN;   // false
parseInt('abc');  // NaN

非数值转化为数值

  • 有三个函数可以把非函数转换为数值
    • Number( )
    • parseInt( )
    • parseFloat( )
  • Number( ):将任何类型的值转化为数值。但Number规则相当复杂而且不合理
    转换规则如下:
    • 如果是Boolean值,true和false分别转化为1和0
    • 如果是数字,只是简单的传入和返回
    • 如果是null, 返回0
    • 如果是undefined, 返回NaN
    • 如果是如果是字符串,按照下面的规则:
      • 如果只包含数字,则将其转化为十进制。
      • 如果数字中包含浮点格式,比如‘1.1’转化为1.1
      • 如果包含有效的十六进制,比如‘0xf’转化为15
      • 如果字符串是空的(不包含任何字符)转化为0
      • 如果包含上述其他的格式转化为NaN
    • 如果是对象,则调用对象的valueOf()方法,依照前面的规则转化,如果结果为NaN,则调用对象的toString()方法,再次按照前面的方法转换返回的字符串
number (false) //  0
number (true) //  1
number (123) //  123
number (null) //  0
number (undefined) //  NaN
number (0xe) //  14
number (" ") //  0
number ({toString:function( ){return '123'; }}) //  123
number ({valueOf:function( ){return 456; }}) //  456
  • parseInt( )和parseFloat( )
    • parseInt( ) :把值转换成整数
    • parseFloat( ):把值转换成浮点数
    • 使用规则:
      • 忽略字符串前面的空白字符,找到第一个非空白字符
      • 如果第一个字符不是-或者数字,返回NaN
      • 如果是继续解析,知道非数值模式为止
      • 0开头会当做八进制,0x开头会当做十六进制,但是可以制定第二个参数制定基数
parseInt('blue'); //  NaN
parseInt('-23ABS'); //  -23
parseInt('0xf1'); //  241
parseInt('101',2); //  5

==与===的区别

  • === : 严格相等(全等操作符),两个被比较的值在比较前都不进行隐式转换。若两者类型不同,则值不相等。
  • ==: 非严格相等(相等操作符),在比较前将两个被比较的值转换为相同类型。
  • 一般来说,使用全等操作符总是对的,因为全等操作符的结果更容易预测,并且因为没有隐式转换,全等比较的操作会更快。

break与continue的区别

  • break用于强制退出循环体,执行循环后面的语句
for (var i=1 ; i<10 ; i++) {
     if (i % 4 ===0) {
         break;
     }
     console.log(i);
}              // 1,2,3
  • continue用于退出本次循环,执行下次循环
for (var i=1 ; i<10 ; i++) {
     if(i % 4 ===0) {
        continue;
     }
     console.log(i);
}              // 1,2,3,5,6,7,9

void 0 和 undefined在使用场景上的区别

undefined可以在局部作用域中被重写,
而void运算返回值都是undefined。

function fn() {
    var undefined = 3;
    var a;
    if { a===undefined }{
        console.log('===')
    } else {
        console.log('!==')
    }
}
fn()           // !==
function fn() {
    var undefined = 3;
    var a;
    if { a===void 0 }{
        console.log('===')
    } else {
        console.log('!==')
    }
}
fn()           // ===

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

console.log(1+1);      //2,数字相加
console.log("2"+"4");        //"24",字符串拼接
console.log(2+"4");       //"24",类型不同,转换为字符串,拼接
console.log(+"4");      //4,字符串转换为数字
  • 加法运算符对不同的数据类型有不同的含义
    • 在两个操作数都是数字的时候,会做加法运算
    • 两个参数都是字符串或在有一个参数是字符串的情况下会把另外一个参数转换为字符串做字符串拼接
    • 在参数有对象的情况下会调用其valueOf或toString
    • 在只有一个字符串参数的时候会尝试将其装换为数字
    • 在只有一个数字参数的时候返回其正数值

代码分析

var a = 1;    //  a=1
a+++a;    //  相当于(a++)+a,a经过自增运算后为2,但(a++)为1,故该式为3
typeof a+2;    //  typeof优先级高于+,即相当于(typeof a)+2,即"number2"
 var a = 1;    //  a=1
 var b = 3;    //  b=3
 console.log( a+++b );    //  (a+++b)即((a++)+b),(a++)为1,1+3=4

遍历数组[3,4,5],把数组里的打印数组每一项的平方

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

遍历 JSON, 打印里面的值

var obj = {
 name: 'hunger', 
 sex: 'male', 
 age: 28 ;
}

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

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

逻辑或(||):如果expr1能转换成true则返回expr1,否则返回expr2. 因此,在boolean环境(在if的条件判断中)中使用时, 二者操作结果中只要有一个为true,返回true;二者操作结果都为false时返回false.

逻辑与(&&):如果expr1 能转换成false则返回expr1,否则返回expr2. 因此, 在Boolean环境中使用时, 两个操作结果都为true时返回true,否则返回false.

var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0   
/* 
(typeof a + b) = "number2" , "number2" || c >0则输出"number2" 
*/
console.log(val)    //  number2



var d = 5;
var data = d ==5 && console.log('bb')    //d ==5为ture,故data =console.log('bb')
console.log(data)    //console.log(data)=console.log(console.log('bb')),值为 undefined;



var data2 = d = 0 || console.log('haha')    
/*
相当于var data2 = d = (0 || console.log('haha'))
即data2 = console.log('haha')
*/
console.log(data2)    //console.log(data2)相当于console.log(console.log('haha')),即undefined
 


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

推荐阅读更多精彩内容