《javascript高级教程》学习笔记变量和数据类型

我不吃饼干呀      2022-02-14     339

关键词:

  • JavaScript的核心语言特性在ECMA-262中是以名为ECMAScript的伪语言的形式来定义的。

    一、变量和数据类型

    1. 变量

    JavaSript是弱类型语言,可以通过var定义任何类型变量,同时同一变量可以被赋值成不同类型。

    JavaScript可以在语句结尾省略分号,JS会自动添加分号,但是最好加分号:1.减少错误 2.方便压缩 3.提高性能

    var msg = ‘mdzz‘;   // String
    msg = 1024;         // Number

    var 声明变量,函数作用域

    2. 数据类型

    JavaScript一共有5中基本数据类型,通过typeof可以查看变量的数据类型。 typeof(变量/数值字面量) 返回对应数据类型字符串

    1. Undefined

    只有一个值,undefined,声明又没有初始化的变量,默认值为undefined。也可以显示给变量赋值undefined

    var msg; // x相当于 var msg = undefined
    typeof(msg)
    >> "undefined"

     typeof(未声明变量) 也会返回"undefined"

    2. Null

    同样只有一个值,为nulltypeof(null)返回‘object‘

    3. Boolean

    两个值,truefalse。所有其他类型的值,都可以通过 Boolean(variable) 转换成true或者false。 转换规则:

    数据类型truefalse
    String 非空字符串 空字符串(‘‘
    Number 非零数值 0NaN
    Object 任何对象 null
    Undefined   undefined

    某些时候变量会自动转换成Boolean,如 if(variable) 相当于 if( Boolean(variable) ) 

    4. Number

    可以表示整数或浮点数。0开头表示八进制,0x开头表示十六进制。

    特殊值:

    • Number.MIN_VALUE(最小值
    • Number.MAX_VALUE(最大值
    • Infinity(无穷大,超过JS数据范围,可以通过Number.POSITIVE_INFINITY得到
    • -Infinity (负无穷,Number.NEGATIVE_INFINITY
    • Number.MAX_SAFE_INTEGER(最大整数
    • Number.MIN_SAFE_INTEGER(最小整数
    • NaN

    任何涉及NaN的操作都返回NaN,如Nan / 10

    NaN不等于任何值,包括它本身,NaN == NaN // false

    isNaN()用来判断一个变量是否是数值

    isNaN(NaN)      // true
    isNaN(‘10‘)     // false 可以转化为数数值
    isNaN(true)     // false
    isNaN(‘true‘)   // true

    数值转换:

    Number()parseInt(), parseFloat()

    Number() 转换规则:

    • truefalse会转换为10
    • null返回0
    • undefined返回NaN
    • 字符串忽略前导0,十六进制可以转换,空字符串为0,其他的不合法字符串转换为NaN
    • 对象,调用valueOf()方法,为undefined则调用toString()再转换字符串。

    parseInt()转换规则:

    • 忽略前面的空白 碰到不合法字符转换结束
      parseInt(‘123blue‘);    // 123
      parseInt(‘‘);           // NaN
      parseInt(‘0xA‘);        // 10(十六进制)
      parseInt(‘   22.5‘);    // 22
      parseInt(22.5);         // 22
      parseInt(‘zzz‘);        // NaN
    • 八进制(0开头数字)有的时候转换规则不统一。
    • parseInt(number, radix)转换为指定进制。

    parseFloat()只转换十进制。

    5. String

    单引号()或双引号(")包裹。两种方式没有区别。

    转义字符:

    •  换行
    •  制表
    •  空格
    •  回车
    • \ 斜杠
    •  单引号
    • " 双引号

    str.length 获取字符串长度

    ECMAScript中字符串是不可变的。字符串拼接将产生新的字符串。

    toString()方法: 除了nullundefined值,其他数据都有toString()方法。字符串会返回一个副本。

    > 0x23.toString()
    < "35"
    > ‘0x23‘.toString()
    < "0x23"

    6. Object

    JS可以通过var o = new Object()来创建对象。

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

    • constructor():构造函数
    • hasOwnProperty(propertyName):用于检查当前对象是否存在某个属性。其中propertyName为字符串。
    • isPrototypeOf(Object):用于检查传入的对象是否是另一个对象的原型。
    • propertyIsEnumerable(propertyName):用于检查给定属性是否可以用for-in来枚举。其中propertyName为字符串。
    • toString():返回对象的字符串。
    • valueOf():返回对象的字符串,数值或布尔值表示。

    二、操作符

    1. 一元运算符 

    • 递增递减操作符 ++--,对于整数,使用方法和C语言,Java等相同。但是JS中不仅可以对整数使用,对浮点数也同样适用。同时对于其他类型的变量,会转变成Number然后进行运算,不合法将返回NaN
      var o = {
          valueOf: function() {
              return -1;
          }
      }
      var i = o--;    // i is equal to -1, o change to -2
    • 一元加和减操作符 对于数字,+-和普通的运算符号一样,同时,对于其他类型,可以快速转换成Number类型。
      var o = {
          valueOf: function() {
               return -1;
          }
      }
      var i = -o;    // i is equal to 1, o don‘t change

    2. 位操作符

    • 按位非(~):操作数的负值减一。
    • 按位与(&
    • 按位或(|
    • 按位异或(^
    • 左移(<<
    • 算术右移(>>): 最左端补符号位
    • 逻辑右移(>>>):最左端补0。

    3. 布尔操作符

    • 逻辑非(!):返回布尔值取反。通过两个取反(!!)可以达到Boolean()的效果。
    • 逻辑与(&&):短路操作。如果第一个操作数的布尔值为false,则返回第一个操作数,注意:是返回操作数本身,而不是对应的布尔值! 如果第一个操作数对应的布尔值为true,则返回第二个操作数。
      if (obj != null) {
          obj.doSomething();
      }
      // 上面的代码可以简化成下面的代码
      obj && obj.doSomething();
    • 逻辑或(||):和逻辑与一样,短路操作。
      var obj;
      if (oldObj != null) {
          obj = oldObj;
      } else {
          obj = new Object();
      }
      // 上面的代码可以简化成下面的代码
      obj = oldObj || new Object(); 

    4. 乘性操作符

    如果对非数值操作数进行乘性运算,将会自动转换成数值。

    • 乘法(*

    超过数据范围返回Infinity-Infinity

    有一个操作数是NaN返回NaN

    Infinity0相乘,返回NaN;

    Infinity和非零数值,Infinity相乘,返回Infinity;

    • 除法(/

      x/NaNNaN/xInfinity/Infinityx/0返回NaN

    • 求模(%

    x/Infinityx/0 => NaN

    x(有限数值)/Infinity => x 

    5. 加性操作符 

    • 加法

    可以进行数值运算或者字符串运算。

    如果有一个操作数是字符串,另外一个操作数将转换成字符串然后连接。

    • 减法

    非数值性操作数将转换成对应数值。 

    6. 关系操作符

    • 小于(<),大于(>),小于等于(<=),大于等于(>=
    • 和数值的比较,非数值操作数将转换为数值。
    • 字符串之间按字典序比较。

    7. 相等操作符

    • 相等(==)和不相等(!=
    • 两个操作数会先做强制类型转换,然后再比较他们的相等性。 不同数据类型转换规则:
      1. Boolean -> 0 or 1
      2. String 比较 NumberString -> Number
      3. Object 比较 其他类型,对象会取valueOf()方法返回的值
      4. null == undefined // true
      5. null == anything // false
      6. null != anything // true
      7. 如果两个操作数都是对象,则当他们指向同一个对象时相等。
    • 全等(===)和不全等(!==
      1. 如果两个操作数数据类型不相等返回false而不会进行类型转换。

    8. 条件操作符(? :) 

    9. 赋值操作符(=

    10. 逗号操作符(,):返回最后一项

    三、语句

    就算只有一行代码,最好也用{ }括起来。

    1. if语句

    2. do-while()语句

    3. while语句

    4. for语句

      在for语句中定义的变量,就算在语句结束后也仍然生效,因为var定义变量是函数作用域。

      var count = 10;
      for (var i = 0; i < count; i++) {
          // do something...
      }
      alert(i);   // 10
    5. for-in语句

      输出顺序不定。循环之前应该先确认对象的值是不是nullundefined

      for (property in expression) {
          statement
      }
    6. label语句

      label: statement

      指定breakcontinue的位置。(和Java中相同。

    7. breakcontinue语句

    8. with语句

      with语句的作用是将代码的作用域设置到一个特定的对象中。严格模式下不允许使用。

      语法:with(expression) statement;

      var qs = location.search.substring(1);
      var hostName = location.hostName;
      var url = location.href;
      // 简化成以下代码
      with(location) {
          var qs = search.substring(1);
          var hostName = hostName;
          var url = href;
      }
    9. switch语句

      switch(expression) {
          case value1: statement
              break;
          case value2: statement
              break;
          case value3: statement
              break;
          ... // other case
          default: statement
      }

      其中expression可以为任何数据类型。这里需要判断expression === value。

    四、函数

    函数的基本语法:

    function functionName(arg0, arg1, ..., argN) { 
        // 函数声明
        statements
    }
    functionName(); // 函数调用

    ECMAScript中调用函数时的参数可以和函数声明时参数个数不同。ECMAScript中的参数在内部使用一个数组来表示的,在函数体内可以通过arguments对象来访问这个参数数组。

    arguments并不是Array的实例,但是可以通过arguments[index]获取任意一个元素。通过arguments.length可以获得参数个数。

    我们可以通过参数个数的判断实现重载。但是JavaScript中本身是没有函数重载的,如果定义了名字相同的多个函数,那么将只有最后的函数生效。

    function doAdd(num1, num2) {
        if (arguments.length == 1) {
            alert(num1 + 10);
        } else if (arguments.length == 2) {
            alert(arguments[0] + num2); // arguments[0] is equals to num1
        }
    }

    arguments和命名参数是同步的,但是未传递的参数不可以通过改变arguments改变。谨记arguments不是数组。

    function doAdd(num1, num2, num3) {
        console.log(arguments.length); // 2
        console.log(num1, num2, num3, arguments[0], arguments[1], arguments[2]); // 1 2 undefined 1 2 undefined
        num1 = 3; arguments[1] = 4; arguments[2] = 5;
        console.log(arguments.length); // 2
        console.log(num1, num2, num3, arguments[0], arguments[1], arguments[2]); // 3 4 undefined 3 4 5
    }
    doAdd(1, 2);

     


    《javascript高级程序设计》学习笔记|4.1.原始值与引用值

    关注前端小讴,阅读更多原创技术文章原始值与引用值JS变量是松散类型的:①不必规定变量的数据类型②变量的值和数据类型可随时改变JS变量可以包含2种类型的数据:原始值和引用值原始值是简单数据(6种原始值:Undefined、... 查看详情

    笔记:学习javascript闭包(closure)

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。下面就是我的学习笔记,对于Javascript初学者应该是很有用的。一、变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域... 查看详情

    前端学习(3262):js高级教程数据变量和内存

         查看详情

    html学习笔记javascript(变量)

    ...。通过上面的表达式z=x+y,我们能够计算出z的值为5。在JavaScript中,这些字母被称为变量。提示:您可以把变量看做存储数据的容器。 JavaScript变量与代数一样,JavaScript变量可用于存放值(比如x=2)和表达 查看详情

    javascript学习笔记

    从今天开始学习JavaScriptJavaScript常用数据类型如下:1.数值类型(number):包含整数和浮点数2.字符串类型(string):字符串必须使用双引号或单引号3.布尔类型(boolean):只有true和false两个值4.未定义类型(Undefined):专门用来... 查看详情

    javascript高级程序设计---学习笔记

    ...、读取属性特性对象的属性在创建时都带有一些特征值,JavaScript通过这些特征值来定义它们的行为。这些特性是为了实现JavaScript引擎用的,因此不能直接访问它们。ECMAScript中有两种属性:数据属性和访问器属性。1)数据属性... 查看详情

    javascript高级程序设计(第三版)学习笔记8910章

    第8章,BOMBOM的核心对象是window,具有双重角色,既是js访问浏览器的一个接口,又是ECMAScript规定的Global对象。因此,在全局作用域中声明的函数、变量都会变成window对象的属性和方法。例:varage=20;functionsayAge(){alert(this.age);}alert(... 查看详情

    javascript学习笔记

    JavaScript笔记BOM对象(文档型对象)DOM对象(浏览器对象)变量要区分大小写,在同一行可以定义多个变量,中间使用‘,’分割JavaScript语句中可以在末尾使用;也可不使用,但是推荐使用数据类型转换: 整型转换字符串获得的... 查看详情

    javascript高级程序设计(第三版)学习笔记

    第三章 基本概念1、严格模式:对ES3中不确定的行为作出处理,对某些不安全的操作抛出错误。要在整个脚本中启用严格模式,可以在顶部加上"usestrict";要在函数中启用严格模式,可以在函数顶部加上"usestrict"。2、定义变量... 查看详情

    《javascript高级程序设计》学习笔记|6.2.array

    关注前端小讴,阅读更多原创技术文章ArrayECMAScript的数组是一组有序的数据(和其他语言相同),每个槽位可以存储任意类型的数据(和其他语言不同)ECMAScript的数组是动态大小的,随着数据添加而自动增长相关代码→创建数... 查看详情

    学习javascript闭包(closure)

    ...取自阮一峰老师的学习笔记,特此声明闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。下面就是我的学习笔记,对于Javascript初学者应该是很有用的。一、变量的作用域要理解闭包,首... 查看详情

    js-javascript高级程序设计学习笔记16

    第20章JSONJOSN,JavaScript对象表示法,是JS的一个严格的子集,但是它是一种数据格式,虽然与JS具有相同的语法形式,但是不从属于JS。1、语法①可表示简单值——字符串、数值、布尔值、null,但不支持undefined;②对象——复杂... 查看详情

    《javascript高级程序设计》学习笔记|8.3.继承

    关注前端小讴,阅读更多原创技术文章继承面向对象语言支持2种继承方式:接口继承和实现继承JS函数没有签名(不必提前声明变量的类型),只支持实现继承,依靠原型链相关代码→原型链子类型构造函数的原型,被重写为超... 查看详情

    语言javascript学习笔记

    文章目录1)快速入门1.1JavaScript与网页(html文档)1.2怎么在浏览器中调试JavaScript代码?2)基本语法相关3)数据类型和变量相关相等运算符:NaN:浮点数的相等比较:null和undefined:对象࿱... 查看详情

    学习javascript闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。下面就是我的学习笔记,对于Javascript初学者应该是很有用的。一、变量的作用域要理解闭包,首先必须理解Javascript特殊的变量作用域... 查看详情

    js-javascript高级程序设计学习笔记4

    第六章面向对象的程序设计1、面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。如python。ES中没有类的概念。2、ES的对象可以想象成散列表:无非就是一组名值对,... 查看详情

    javascript高级程序设计学习笔记第五章上

     第五章 引用类型的值(对象)是引用类型的一个实例。在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起。它也常被称为类,但这种称呼并不妥当。尽管ECMAScript从技术上讲是一门面向对象的语言,但它不具... 查看详情

    javascript学习笔记:定义函数调用函数参数返回值局部和全局变量

    定义函数、调用函数、参数、返回值关键字function定义函数,格式如下:function函数名(){ 函数体}调用函数、参数、返回值的规则和c语言规则类似。1<!DOCTYPEhtml>2<html>3<headlang="en">4<metachaset="UTF-8">5<title></title... 查看详情