Javascript大犀牛看书笔记

第二章 词法结构

  • javascript区分大小写,而html不区分大小写

  • unicode转义序列是由/u为前缀加4位16进制数组成

  • 标识符必须以字母,下划线 _,美元符 $,开始

  • 分号:javascript中语句独占一行,通常可以省略语句之间的分号。

      例外:
    
         1. return,break,continue,后紧跟换行,javascript会在换行处补填分号。
    
         2. 双目运算符++,--,若想作为表达式后缀的话必须与表达式同一行。
    复制代码

第三章 类型,值和变量

  • javascript支持十进制和十六进制,因ECMAscript标准不支持八进制直接量,因此最好不要用以0为前缀的直接量

  • Math对象的属性:

        math.round(.6)   //=>1.0 四舍五入

        math.ceil(.6)   //=>1.0 向上去整

        math.floor(.6)   //=>0.0 向下去整
复制代码
  • 算数运算中的特例

    • 溢出(overflow):数字运算结果超过了javascript所能表示的上限
正数返回Infinity,负数返回-Infinity

   - 下溢(underflow):结果比javascript所能表示的最小数小,返回0,

负数下溢会返回特殊的值’-0’

  -  被0整出返回Infinity或-Infinity,例外,0/0返回NaN

  - NaN:和任何值都不相等,包括自身
复制代码
  • 判断isNaN()函数
        x!=x;  //仅当x为NaN,为true
复制代码
  • 0和-0值除了作为除数外两个值是相等的

  • 二进制浮点数并不能精确表示类似于0.1的简单数字

        (.2-.1)==(.3-.2);  //=>>false
复制代码
  • 字符串直接量:用单引号来界定字符串时,需格外小心英文中的所有个和缩写,需用(/)转义

    • Javascript和HTML带吗使用各自独立的引号风格

    • Javascript表达式使用单引号表示字符串

    • HTML事件处理属性时用双引号表示字符串

  • 属性:
        s.replace(“h”,”H”); //”hello”=>”Hello”

        s.toUpperCase( ); //”hello”=>”HELLO”
复制代码
  • 字符串还可以当作只读数组,通过方括号访问
  • 布尔值:javascript的任意值都可以转化为布尔值

    False:undefined ; null ; 0 ; -0 ; NaN ;‘ ‘
    
    True: 所有其他值,包括所有对象,数组
    复制代码
  • Null是javascript的关键字,undefined是预定义的全局变量,“==”认为两者是相等的

  • 包装对象

        var s=”test”;

        S.len=4;

        Var t=s.len; //undefined
复制代码
    在读取字符串,数字和布尔值的属性(或方法)时,表现得像对象一样。但试图给其属性赋值,则会忽略该操作:修改只发生在临时对象上,而临时对象并未继续保留下来
复制代码
  • 原始值是不可改变的。(undefined,null,布尔值,数字,字符串)

  • 对象的值可通过对象属性来更改(数组,函数)

    • 两个对象包含相同的属性和值也不相等
  • Number()和parseFloat()区别

    • Number():只能用于十进制数转换,并且不能出现非法尾随字符

    • parseInt():会跳过任意数量的前导空格,并忽略后面的内容,第一个非空格字符是非法的数字直接量则返回NaN

  • 所有的对象转换为布尔值都是true

  • 尽管全局作用域编写代码时可以不写var语句,但声明局部变量时必须使用var语句

  • 声明提前:函数体内局部变量遮盖同名全局变量,函数体内的变量声明会提前至函数体顶部

  • 声明一个javascript全局变量时,实际上是定义了全局对象的一个属性

  • javascript中,所有柱子都是浮点型的,除法运算结果也是浮点型

第四章

  • “===”:当两操作数类型和值都相等。0===-0

  • “==”:若两操作数不是同一类型,会尝试进行类型转换

  • 加号运算符更偏爱字符串;比较运算符更偏爱数字,只有两个数都是字符串时才会进行字符串比较,若一个操作数是NaN,总返回false

  • 大多数情况下 a op= b;等价于a = a op b;当a包含具有副作用的表达式时不等价,eg:data[i++]*=2; data[i++]=data[i++]*2;

  • typeof(NaN)==”number”;

  • delete只能删除对象属性或数组元素,不像C++中用来删除整个对象

    • delete的操作数若不是左值,不进行操作返回true;若删除成功,返回true

第五章 语句

  • 如果有特殊目的,需要使用空语句,最好在代码中添加注释,可清楚说明这条语句是有用的。

  • 函数定义的两种写法

var f=function(x)
{
    return x+1;
}//表达式赋值给一个变量
function f(x)
{
    return x+1;
}//含有变量名的语句
复制代码
  • 两者区别: 使用var的话只有变量声明提前,变量初始化代码仍在原位置,使用函数声明语句,函数名称和函数体均提前。

  • switch语句的case操作实际上是“===”,因此不会做任何类型转换

  • switch语句中可用return代替break

  • “default:”标签可以放在switch内任何地方

  • 死循环:while(true);for(;;);

  • for/in循环可以枚举对象属性和数组索引

  • for/in循环只能遍历到“可枚举”的属性

  • return语句可以单独使用而不必带expression,函数返回undefined

  • 严格模式与非严格模式的重要区别 1.严格模式中禁止使用with语句 2.严格模式下,所有变量都要先声明 3.严格模式下调用函数中(不是方法)的this值是undefined,非严格模式中函数中的this值是全局对象

第六章 对象

  • 创建对象方法,es5定义了一个名为Object.create()的方法,他创建一个新对 象,其中第一个参数是这个对象的原型。

  • 通过(.)和([ ])运算符来获取属性的值,对于(.)来说,右侧必须是一个以属性名称命名的简单标识符。对于([ ])来说,方括号内必须是一个计算结果为字符串的表达式(使用“ ”)

  • 在javascript中,只有在查询属性时才会体会到继承的存在,而设置属性则和集成无关

  • 查询一个不存在的属性并不会报错,返回undefined;查询不存在的对象的属性时会报错(null和undefined值都没有属性)

  • delete运算符只能删除自有属性,不能删除继承属性

  • delete不能删除可配置性为false的属性,(比如通过var声明的全局对象的属性),非严格模式会返回false

  • 检测属性可使用in运算符,或使用“!==”判断一个属性是否为undefined;但in可以区分不存在的属性和存在但值为undefined的属性

第七章 数组

  • 数组直接量的语法("[]")允许有可选的结尾的逗号,故[,,]只有两个元素(undefined)而非三个

  • 可使用构造函数array创建数组,

var a=new Array();
var a=new Array(10);//一个数值参数指定长度
var a=new Array(5,4,3,2,1,"testing,testing");//显式指定两个或多个数组元素获知数组的一个非数值元素
复制代码
  • 数组是对象的特殊形式,javascript将制定的数字索引值转换成字符串——1变成"1"——将其当作属性名来使用

  • 数组的特别之处就在于当使用小于2^32的非负整数作为属性名时数组会自动维护其length属性值

  • 所有的索引都是属性名,但只有在0~2^32-2之间的整数属性名才是索引,如果使用的属性是数组的索引,数组就会根据需要更新length

  • 数组索引仅仅是对象属性名的一种特殊类型,这意味着javascript数组没有"越界"错误的概念

  • 添加数组元素时可以使用push()方法在数组末尾增加一个或多个元素,和给a[a.length]赋值是一样的

  • 使用delete不会修改数组的length属性,会变成稀疏数组

  • javascript不支持真正的多维数组,但可以用数组的数组来近似

  • Array.join()方法将所有元素转化为字符串并连接在一起,返回最后生成的字符串,是String.split ()方法的逆向操作(将字符串分割成若干块来创建一个数组)

  • 字符串的行为类似于只读数组,可以用charAt()方法和[]来访问单个字符

第八章 函数

  • 函数声明语句被提前到外部脚本或外部函数作用域的顶部,所以可以在它定义之前出现的代码所调用;表达式定义的函数赋值给一个变量,变量的声明提前但赋值没有,所以在定义之前无法调用

  • 函数声明语句并非真正的语句,它可以出现在全局代码里,或内嵌在其他函数中,但它不能出现在循环,条件判断,或者try/cache/finally以及with语句中,但函数的定义表达式可以出现在javascript代码的任何地方

  • 关键字this没有作用域限制,嵌套函数不会从调用它的函数中继承this。嵌套函数作为方法调用时,this值指向调用它的对象。嵌套函数作为函数调用时,非严格模式下this是全局对象,严格模式下是undefined

  • javascript的"函数重载",标识符arguments是指向实参对象的引用,实参对象是一个类数组对象,可以通过数字下标访问传入函数的实参值,而并不一定通过名字得到实参

  • javascript中无法声明只在一个代码块内可见的变量,因此,常定义一个函数用做临时的命名空间。(直接定义一个匿名函数并在单个表达式中调用它)

(function(){
	//code 
}());
复制代码

转载于:https://juejin.im/post/5a45a71bf265da430e4f7a0a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值