• 《深入理解JavaScript》——Day1


    学习了几天《JavaScript设计模式》后,发现虽然这个人写的书还是不错的,但貌似其中的代码普遍带有bug,导致无法运行,而我也不会调试,说明我JavaScript的基础还是不够好,在图书馆里找到了这本书,今天我就开始学习这本书,对JavaScript这门灵活的语言有一个更加深入的理解!Let`s Start!

    第一章  基础JavaScript

    导读:在刚开始学习JavaScript的时候,用它来进行编程感受。这是作者定义的一个JavaScript子集,是我们在学习的时候更有效率。

    1.首先注意等号的用法:

    一个等号(=)用于变量赋值

    三个等号(===)用于比较两个值

    2.语句和表达式

    ●  语句“做事情”。例如这个语句,它用来声明(或创建)一个变量foo: var foo;

    ●  表达式产生值。它们通常是函数的参数,或是赋值的右半部分。例如: 3 * 7;

    3.保留字

    以下标识符作为保留字,不能作为变量名使用:

    arguments break case catch
    class const continue debugger
    default delete do else
    enum export extends false
    finally for function if
    implenments import in instanceof
    interface let new null
    package private protected public
    return static super switch
    this throw true try
    typeof var void while

     还有3个标识符不是保留字,但是需要视为保留字: Infinity、NaN、undefined。

    4.值

    在JavaScript中,所有的值都有属性。每一个属性都有一个key(或name)和一个value。可以认为属性就像是一条记录的字段。

    例如字符串‘abc’有length这个属性:

    ‘abc’.length  // 3

    5.原始值和对象

    JavaScript中,对值得区分有点自由:

    ●  原始值(primitive)包括布尔值、数字、字符串、null和undefined。

    ●  其他的值都是对象(Object)。

    这两者最主要的区别在于它们的比较方式;每个对象都有唯一的标识且只(严格地)等于自己

    var obj1 = {};  // 一个空对象
    var obj2 = {};  // 另一个空对象
    console.log (obj1 === obj2);  // false

    我:这其中包含了更加底层的原理,比如堆内存和栈内存的区别,和Object.prototype和__proto__的指向问题等,以后再来做解释,先留个坑。

    相反,所有的原始值,只要编码值相同,则被视为相等:

    var a = 'abc';  // 一个字符串
    var b = 'a' + 'b' + 'c';  // 另一个字符串
    console.log ( a === b );  // true
    var a = 123;  // 一个数字
    var b = 123;  // 另一个数字
    console.log ( a === b );  // true

    而原始值具有以下特点:

    (1)  按值进行比较。如上面的例子。

    (2)  不可改变。也就是说:原始值一旦创建,其属性不能被改变、添加或移除。

    var a = 'abc';
    
    delete a.length;  // 无效
    
    a.length = 1;
    console.log (a.length);  // 3
    
    a.foo = 2;
    console.log (a.foo);  // undefined

    对象具有以下特点:

    (1)  按引用进行比较。每个值都有各自的身份标识。

    console.log( {} === {} );  // false
    
    var obj1 = {};
    var obj2 = obj1;
    console.log( obj1 === obj2 );  // true

    (2)  默认可变。对象属性可以很自由的被改变、添加和移除。

    var a = {};
    
    a.x = 1;  // 添加
    console.log ( a.x );  // 1
    
    a.x = 2;  // 改变
    console.log ( a.x );  // 2
    
    delete  a.x;  // 删除
    console.log ( a.x );  // undefined

    6. undefined和unll

    ●  undefined的意思是“没有值”。

    ① 未被初始化的变量即为undefined:

    var foo;
    console.log ( foo );  // undefined

    ② 丢失的参数也是undefined:

    function f ( x ) {
        return x;
    }
    console.log ( f() );  // undefined

    ③ 访问不存在的属性,也会得到undefined:

    var a = {};
    console.log ( a.x );  // undefined

    ●  null的意思是“没有对象”或“空指针”。

    注意:undefined和null没有属性,甚至连toString()这种标准方法都没有!

    7. 使用typeof和instanceof对值分类

    (1) typeof

    用法: typeof value

    它的返回值会是一个表示这个值“类型”的字符串。typeof的所有结果如下:

    操作数 结果
    undefined undefined
    null object
    布尔值 boolean
    数字 number
    字符串 string
    函数 function
    所有其他的常规值 object

    (2) instanceof

    用法: value instanceof Constructor

    如果value是一个通过Constructor构造器创建的对象,则返回true:

    console.log( [] instanceof Array );  // true
    console.log( {} instanceof Object );  // true
    console.log( [] instanceof Object );  // true

    我:由此我们可以看出,使用typeof时,如果遇到数组,那么typeof的结果为object,那么我们就不知道它是否是一个数组。因此我们可以用instanceof来判断该对象是否为数组。

    另,下面的例子看出typeof null === object只是JavaScript设计上的一个bug(属于历史遗留问题), 它不属于对象。

    console.log( null instanceof Object );  // false

    8. 布尔值

    (1) 注意:以下的值会被解释成false:

    ●  undefined、null

    ●  布尔值:false

    ●  数字: -0、NaN

    ●  空字符串: ‘’

    除此之外的所有值都会解释成true。

    (2) 二元逻辑运算符(&&和||)

    JavaScript中的二元逻辑运算符是短路的。因为如果第一个运算数就足以确定结果,则不会对第二个运算数进行评估。

    与(&&)—— 如果第一个运算数为假,返回它。否则,返回第二个运算数。

    或(||)—— 如果第一个运算数为真,返回它。否则,返回第二个运算数。

    9. 数字

    JavaScript中所有的数字都是浮点数:

    console.log( 1 === 1.00 );  // true

    这里要提及一个Infinity,多数情况下是一个错误的值:

    console.log( 3 / 0 );  // Infinity

    注:Infinity比任何一个数都要大(NaN除外)。同样的,-Infinity比任何数都要小(NaN除外)。这使得这两个数字常用来作为默认值(比如当你需要一个最小值和一个最大值的时候)。
    我:例:

    function max() {
        var max = Number.NEGATIVE_INFINITY;
        for ( var i = 0; i < arguments.length; i++ ) {
            if ( arguments[i] > max ) {
                max = arguments[i];
            }
        }
        return max;
    }
    var large = max( 610,1330,200,500,654 );
    console.log( large );

    10. 运算符

    其他的比较简单,不在这里赘述。注意的是一个技巧:转变为数字: +值。

    11. 函数

    函数可以用函数声明的方式创建:

    function add( param1 , param2 ) {
        return param1 + param2;
    }

    也可以使用函数表达式的方式创建:

    var add = function ( param1 , param2 ) {
        return param1 + param2;
    };

    其中函数声明具有提升特性——它们的实体会移动到所在作用域的开始处。

    我:详情参考《你不知道的JavaScript(上卷)》

    12. 特殊的变量arguments

    在JavaScript中,函数的所有参数都可以被自由调用,它会通过arguments变量来使所有参数可用。它看起来像是一个数组,但它却不具备数组的方法,它只是一个类数组的变量。

    它有length属性和可以用[]访问它的元素。但除此之外,它不具备其他的数组的方法。

    13. 变量作用域和闭包

    我:详情参考《你不知道的JavaScript(上卷)》

    剩下的内容就是简单的介绍了,不一一写上来了。详情我后面会每一节每一节的详细叙述。

  • 相关阅读:
    红蓝对抗之Windows内网渗透
    [框架漏洞]Thinkphp系列漏洞【截至2020-07-20】
    xss
    OWASP TOP 10 详解
    关于URL编码/javascript/js url 编码/url的三个js编码函数escape(),encodeURI(),encodeURIComponent()
    用C#实现的几种常用数据校验方法整理(CRC校验;LRC校验;BCC校验;累加和校验)
    批处理(.bat)简单应用实例
    线状地物图斑化全流程作业(使用ArcMap软件)
    VS Code Remote配置
    二分查找
  • 原文地址:https://www.cnblogs.com/luohaoran/p/5959316.html
Copyright © 2020-2023  润新知