JavaScript变量与类型

javascript笔记(一)

变量

  • 局部变量
    用 var 操作符定义的变量将成为定义该变量的作用域中的局部变量。也就是说,如果在函数中使用 var 定义一个变量,那么这个变量在函数退出后就会被销毁,例如:

      ```
      function test(){
          var message = "hi"; // 局部变量
      }
      test();
      alert(message); // 错误!
      ```
    

这里,变量 message 是在函数中使用 var 定义的。当函数被调用时,就会创建该变量并为其赋值。而在此之后,这个变量又会立即被销毁,因此例子中的下一行代码就会导致错误。不过,可以像下面这 样省略 var 操作符,从而创建一个全局变量:

    ```
    function test(){   
        message = "hi"; // 全局变量
    }
    test();
    alert(message); // "hi"
    ```

​ 这个例子省略了 var 操作符,因而 message 就成了全局变量。这样,只要调用过一次 test()函数,这个变量就有了定义,就可以在函数外部的任何地方被访问到。
注:虽然省略 var 操作符可以定义全局变量,但这也不是我们推荐的做法。因为在局部作用域中定义的全局变量很难维护,而且如果有意地忽略了 var 操作符,也会由于相应变量不会马上就有定义而导致不必要的混乱。

JavaScript 与其他语言的(如 Java)的重要区别是在 JavaScript 中语句块(blocks)是没有作用域的,只有函数有作用域。因此如果在一个复合语句中(如 if 控制结构中)使用 var 声明一个变量,那么它的作用域是整个函数(复合语句在函数中)。 但是从 ECMAScript Edition 6 开始将有所不同的, let 和 const 关键字允许你创建块作用域的变量。

数据类型

JavaScript有5种原始类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String。还有1种复杂数据类型:Object。在JavaScript中Function、Arrary、Date...都是Object对象类型。

null和undefined是不一样的。只声明未赋值的变量,是undefined的。

var m;
undefined
null == undefined; // 因为==有自动类型转换
true
null === undefined;
false
NaN != NaN;
true
NaN !== NaN;
true

有一个isNaN()函数,测试入参是否不能转为数字。

isNaN(true);
false
isNaN(false);
false
isNaN("");
false
isNaN("ss");
true
isNaN(null);
false
isNaN(undefined);
true
isNaN([]);
false
isNaN({});
true

可以看到,布尔型,空字符串,null,空数组{}。都是可以转为数字的。
undefined,空对象是不能转为数字的。

在JavaScript中Object类型是所有它的实例的基础。像我们知道的Array()、Date()、还有有意思的function()类型,都是从Object继承的。Object 类型所具有的任何属性和方法也同样存在于更具体的对象中。

Object的每个实例都具有下列属性和方法:

  1. constructor:保存着用于创建当前对象的函数。
  2. hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例如:o.hasOwnProperty("name"))
  3. isPrototypeOf(object):用于检查传入的对象是否是调用方的原型
  4. propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句(本章后面将会讨论)来枚举。
  5. toString():返回对象的字符串表示。
  6. valueOf():返回对象的字符串、数值或布尔值表示。

转化为布尔

简单来说就是以下六个值转化结果为false,其他的值全部转换为true

  1. undefined

  2. null

  3. ""(空字符串)

  4. 0

  5. NaN

  6. false
    特别注意:所有对象的布尔值都是true

     Boolean({})
     true
    

注意,js是区分大小写的,不要写错成boolean。

转换为数字

  • Number()转换任意类型参数为数值

      Number(true)
      1
      Number(false)
      0
      Number(undefined)
      NaN
      Number(null)
      0
      Number("")
      0
      Number("1.1")
      1.1
      Number("0xA")
      10       --------自动进行进制转换
      Number("2a")
      NaN
      Number({})
      NaN
      Number([])
      0
    

    Number()转换对象:

    1. 先调用对象自身的valueOf方法,如果该方法返回原始类型的值(数值、字符串和布尔值),则直接对该值使用Number方法,不再进行后续步骤。
    2. 如果valueOf方法返回复合类型的值,再调用对象自身的toString方法,如果toString方法返回原始类型的值,则对该值使用Number方法,不再进行后续步骤。
    3. 如果toString方法返回的是复合类型的值,则报错。
  • parseInt()用于将字符串转换为整数

      parseInt("1.2")
      1
      parseInt("1.7")
      1     -----------截断,非四舍五入
      parseInt("a222")
      NaN
      parseInt("2a")
      2     ----------匹配最长数
      parseInt("")
      NaN   ----------是NaN
      parseInt("0xA")
      10     ---------自动进制转换
    
  • parseFloat()将字符串转为小数

    parseFloat("1.7")
    1.7
    parseFloat("1.7e3")
    1700
    parseFloat("")
    NaN
  • 关于空字符串
    Number("")
    0
    parseInt("")
    NaN
    isNaN("")
    false

parseInt()会返回NaN。isNaN()却又返回false。

自动类型转换

  • “+” 转为字符串拼接
  • “-”,“*”,“/”,"%" 转为数值运算。调用Number()
  • "+","-"做一元运算时,转为数值
  • 布尔运算符,转为布尔型
  • == 和 != 运算,如果类型不同,先进行类型转换。
    原则是:
    • 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false 转换为 0,而true 转换为 1;
    • 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
    • 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法,用得到的基本类型值按照前面的规则进行比较;
    • 这两个操作符在进行比较时则要遵循下列规则。
      null 和 undefined 是相等的。
      要比较相等性之前,不会将 null 和 undefined 转换成其他任何值。

例如:

    null == undfined       //true
    "NaN" == NaN           //false
    NaN == NaN             //false
    5 == NaN              //false
    NaN != NaN            //true
    false == 0           //true
    true == "1"            //true
    undefined == 0        // false

类型检测

typeof()

(1) "undefined"——如果这个值未定义;
(2) "boolean"——如果这个值是布尔值;
(3) "string"——如果这个值是字符串;
(4) "number"——如果这个值是数值;
(5) "object"——如果这个值是对象或 null;
(6) "function"——如果这个值是函数。

相等与严格相等

相等运算符(==)比较两个“值”是否相等,严格相等运算符(===)比较它们是否为“同一个值”。两者的一个重要区别是,如果两个值不是同一类型,严格相等运算符(===)直接返回false,而相等运算符(==)会将它们转化成同一个类型,再用严格相等运算符进行比较。

相等运算符隐藏的类型转换,会带来一些违反直觉的结果。

建议不要使用相等运算符(==),最好只使用严格相等运算符(===)。

void运算符

void运算符的作用是执行一个表达式,然后返回undefined。

void 0 // undefined
void (0) // undefined

上面是void运算符的两种写法,都正确。建议采用后一种形式,即总是使用括号。因为void运算符的优先性很高,如果不使用括号,容易造成错误的结果。比如,void 4+7 实际上等同于 (void 4) +7
下面是void运算符的一个例子。

var x = 3;
void (x = 5) //undefined
x // 5

这个运算符主要是用于书签工具(bookmarklet)或者用于在超级链接中插入代码,目的是返回undefined可以防止网页跳转。
比如,下面是常用于网页链接的触发鼠标点击事件的写法。
<a href="#" onclick="f();">文字</a>
上面代码有一个问题,函数f必须返回false,或者onclick事件必须返回false,否则会引起浏览器跳转到另一个页面。

function f(){
    // some code
    return false;
}

void运算符可以取代上面两种写法。
<a href="javascript:void(0)" onclick="f();">文字</a>

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

推荐阅读更多精彩内容