重读红宝书之JS基础

说明:这是重读红宝书的读书笔记系列 ( 一 ),如有错误,欢迎指正!

一.js简介

  1. js组成
     ECMAScript,提供核心语言功能
      DOM,提供访问和操作网页内容的方法和接口
     BOM,提供与浏览器交互的方法和接口
  2. 使用方法
      使用script标签在html中嵌入js代码导入外部.js文件,其中可以把script放在head标签中,也可以把script标签放在body标签内容后面。推荐第二种使用方法,因为前者要等到head元素中全部js代码都被下载和执行完成以后,才开始呈现页面内容,会导致浏览器在呈现页面时出现延迟

二.基本概念及数据类型

  1. 语法
     ECMAScript中的一切(变量,函数名,操作符)都区分大小写,如test和Test表示的是两个不同的变量
    标识符是变量、函数、属性、函数参数的名字,标识符规则如下:
    以字母、下划线( _ )、美元符号( $ )开头,其他还可以是数字;
    驼峰命名法,如myName
    ES中的语句以分号结尾,如果省略,解析器会自动加上,但是不建议这样
  2. 变量
      ES变量是松散类型 / 弱类型的,就是可以用来保存任何类型的数据
  3. 数据类型
    3.1 typeof 操作符,检测给定变量的类型,typeof 返回值是小写的(undefined),不是大写的( Undefined )!!有以下几个返回值
      undefined ---- 给定值未定义
      boolean ---- 给定值是布尔值
      string ---- 给定值是字符串
      number ---- 给定值是数字
      object ---- 给定值是对象或者null null表示一个空对象指针
      function ---- 给定值是函数
    3.2 Undefined 类型
      只有一个特殊的 undefined 值,声明了变量但是没有对变量初始化(赋值),这个变量的值就是undefined。
var message;
console.log( message );     // undefined

访问未声明的变量会报错

console.log(res);   //Uncaught ReferenceError: res is not defined

typeof 未声明和未初始化的变量都会返回undefined
3.3 Null 类型
   只有一个特殊的值 null ,表示空对象的指针,因此typeof null 返回 object。一个将要用于保存变量的对象还没有真正保存对象,应该明确地让这个变量保存null值
3.4 Boolean 类型
    只有两个字面值:true和false,True和False不是Boolean值
可以对任何类型的值调用Boolean( )函数,返回一个Boolean值

数据类型转换为true转换为false
Booleantruefalse
String非空字符串空字符串 " "
Number非零数值0和NaN
Object任何对象null
Undefined不适用undefined

3.5 Number类型
  八进制 0 开头,十进制,十六进制 0x开头
NaN 表示一个本来要返回数值但是没有返回数值的操作数
NaN的特点:任何涉及NaN的操作都返回NaN
          NaN与任何值都不相等,包括NaN本身
isNaN() 判断传入的值是否不是数值,会先把传入的值转换为数值,任何不能转换为数值的值都会让这个函数返回true,是数值返回false
数值转换规则 Number( )转型函数

数据类型转换规则/值
Booleantrue转换为1,false转换为0
Number传入什么转换为什么
null0
undefinedNaN
String只包含数字的字符串,转换为对应的十进制数值;其中包含有效的浮点格式,转换为对应的浮点数值;包含十六进制,转换为对应的十进制数值,以上都会忽略前导零!如 Number(“00023”) 转换为 23;Number(“0002.6”)转换为 2.6;Number(“0xff”)转换为255
空字符串转换为0;其他字符串转换未NaN(即不是数值)
Object先调用对象的valueOf( )方法,依照上述规则转换;如果转换结果为NaN,调用对象的toString( )方法,再次按照上述规则转换

parseInt( )和parseFloat( )专门用于把字符串转为数值。
parseInt( ) 会忽略字符串前导空格,直到找到第一个非空字符,第一个字符不是数字字符或负号,返回NaN,第一个字符为数字,继续解析到后续字符或非数字字符(小数点),不会忽略前导零(也就是说可以解析八进制和十六进制,但是在ES5中,不再具有解析八进制的能力,但是可以指定解析的进制基数)
parseFloat( ) 会忽略前导零,只解析十进制,十六进制格式的字符串被转换为0,解析到第二个小数点无效

console.log(parseInt("  123str"));   // 123,忽略前导空格
console.log(parseInt(""));        // NaN,空串
console.log(parseInt("0xA"));     // 10
console.log(parseInt("  22.6"));   // 22,小数点无效
console.log(parseInt("10", 2));    // 2,指定进制基数
console.log(parseInt("10", 8));    // 8
console.log(parseInt("10", 10));   // 10
console.log(parseInt("10", 16));   // 16

console.log(parseFloat("  123atr"));  // 123
console.log(parseFloat("0xA"));     // 0,十六进制
console.log(parseFloat("  22.6"));   // 22.6
console.log(parseFloat("  22.6.3"));  // 22.6,第二个小数点无效
console.log(parseFloat("070"));     // 70 

3.6 string类型
字符串可以由双引号 / 单引号表示,length属性表字符串的长度
转换为字符串方法一:使用toString( )方法,数值、布尔值、对象和字符串值都有toString( )方法,字符串的toString( )方法返回该字符串的副本,但是null 和 undefined没有这个方法
方法二: 使用转型函数String( ),需要转换的str本身有toString( )方法,调用该方法;是null 则转换为"null";是undefined则转换为"undefined"
3.7 object类型
创建方法:new Object( ) / { }

三.操作符

  1. 一元操作符
    1.1 前置自增/减 ++a 和后置自增/减 a++
a = 2;
  console.log(a);    // 2
  console.log(++a);  // 3,输出a自增后的值
  console.log(a);    // 3
  console.log(--a);  // 2,,输出a自减后的值
  console.log(a);    // 2
b = 4;
  console.log(b);    // 4
  console.log(b++);  // 4,输出b自增前的值
  console.log(b);    // 5
  console.log(b--);  // 5,输出b自减前的值
  console.log(b);    // 4

1.2 一元加 / 减操作符
如果不是数值,会对操作数执行Number( )转型函数把操作数转换为数值再进行加减
2. 位操作符
按位非( ~ ):0和1转换
按位与( & ):同1才为1
按位或( | ):有1为1
按位异或( ^ ):只有一个1才返回1
左移( << ):把数值的所有位向左移动指定位数
有符号右移( >> ):以符号位填充移动位,向右移动指定位数
无符号右移( >>> ):以0填充移动位,向右移动指定位数,注意对负数的影响,因为负数是用它绝对值的二进制补码表示的,无符号右移后结果会变得很大。
举个栗子:-64无符号右移五位 -64 >>> 5,此时得到的-64的无符号右移结果就很大

64二进制码00000000000000000000000001000000
取反11111111111111111111111110111111
加11
得到-64的二进制补码11111111111111111111111111000000
以0填充移动的五位00000111111111111111111111111110
  1. 布尔操作符
    3.1 逻辑非( ! ) 逻辑非操作符会先把操作数转换为一个布尔值(相当于调用了Boolean( ) ),再对其布尔值求反。对一个值同时使用两个布尔值,可以得到这个值真正对应的布尔值,如( !!0 )为 false
    3.2 逻辑与( && )属于短路操作,如果第一个操作数是false,返回第一个操作数;如果第一个操作数是true,则返回第二个操作数
    3.3 逻辑或( || ),第一个操作数是true,返回第一个操作数;第一个操作数是false,返回第二个操作数
  2. 乘性操作符,在操作数不是数值时会执行自动的类型转换,调用Number( )
    4.1 乘法( * )
     只有一个操作数有符号,结果为负数;Infinity * 0 = NaN;
      Infinity * Infinity = Infinity;Infinity与非0相乘结果为正负无穷,取决于非0数值的符号
    4.2 除法( / )
     只有一个操作数有符号,结果为负数;0 / 0 = NaN;
      Infinity * Infinity = NaN;非0数值 / Infinity和 0 / 非0数值 结果都为正负无穷,取决于非0数值的符号
    4.3 求模( % ) 就是求余数
  3. 加性操作符
    5.1 加法( + ) 若两个操作数都是字符串,则拼接两个操作数;若只有一个操作数是字符串,则把另一个操作数转换为字符串,再拼接
    5.2 减法( - )若有一个操作数是字符串、布尔值、null、undefined,现在后台调用Number( )转换为数值,再进行计算,若转换结果为NaN,则减法结果为NaN( NaN进行任何操作都为NaN)
  4. 关系操作符
    小于( < )、大于( > )、小于等于( <= )、大于等于( >= )
    若两个操作数都是数值,比较大小;都是字符串,比较ASCII 码;若一个操作数是数值,则把另一个操作数转换为数值再比较;一个操作数是布尔值,则转换为数值再比较,大写字母的ASCII码全部小于小写字母的
console.log( "hello" > "Love" );  // true ,因为大写字母的ASCII码全部小于小写字母的
console.log( null == undefined );   // true
console.log( NaN == NaN );  // false 
  1. 相等操作符
    7.1 相等( == )和不相等( != )
    一个操作数是布尔值,要先转换为数值;
    一个是字符串,另一个是数值,把字符串转换为数值;
    不可以把null 和undefined转换为其他任何值
    任何涉及NaN的操作都是false;
    两个操作数都是对象,比较它们是不是同一个对象,两个操作数都指向同一个对象才返回true
    7.2 全等( === )和不全等( !== ) 更重要在于比较类型,不会转换操作数,此时null === undefined 为false
  2. 条件操作符(三目运算符)
    boolean_expression ? true_value : false_value;
  3. 赋值操作符( += / *= / -= / /=)

四.语句

  1. if语句
  2. do-while语句(后测试循环),先执行一次do,while条件满足,返回执行do,再次判断while,直到不满足while跳出循环(至少会执行一次循环体)
var i = 0;
do{
  i += 2;
}while(i <= 6);
console.log(i);
  1. while语句(前测试循环),先判断是否满足循环条件,满足则执行循环体,不满足直接结束,此时有可能一次循环都不执行
  2. for语句(前测试循环)
var num = 10;
for(var i = 0; i < num; i++){
 console.log(i);  // 0 1 2 3 4 5 6 7 8 9
}
console.log(i);  // 10

最后可以在循环外部访问到 i 是因为ES中没有块级作用域,此时使用var 定义的又是全局变量,因此可以在外部访问到 i

  1. for-in语句,用来枚举对象的属性,ES中对象的属性是没有顺序的,因此通过for-in 枚举的属性名顺序是不定的
  2. break语句:立即退出循环,强制继续执行循环后面的语句
  3. continue语句:立即退出循环,但是退出循环后会从循环顶部继续执行
  4. switch语句

五.函数

function name(arguments){
   //函数体
   return ...;
}

name为函数名,也可以不要,就是匿名函数。
arguments是函数的形参,函数的参数在内部是用数组来表示的,通过访问arguments对象的length属性可以获取到参数的个数。arguments对象的长度是由传入的实参个数决定的。指定了形参,没有传入实参,则那个形参默认为undefined
函数会在执行完return语句后立即停止并退出,在return语句后的代码不会执行
ES函数不能像其他语言中函数一样实现重载,因为它没有函数签名,不能定义接收的参数类型和个数。后定义的会覆盖先定义的同名函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值