DOM标准是独立的(即并不依赖JS)操作结构化文档的方式

BOM实际是个与浏览器有关的对象集合,原来没任何标准可言,H5诞生后才被定义了一些浏览器间通用的对象标准

ES5严格模式"use strict"是一个JS字符串,虽然没将其赋值给某个变量,执行后也不会 有什么效果,但符合JS语法,因此不支持ES5严格模式的老式浏览器会直接忽略它,使用严格模式不会让老式浏览器无法执行代码

与传统的面向对象语言不同,JS实际上没有类,该语言的一切都是基于对象,其依靠的是一套原型系统。由于没有类,JS的继承发生在对象之间

JS中所有的属性和方法都是public的,但其还是提供了隐藏数据的方法

OOP常用到的概念:类、对象、属性、方法、聚合、封装、继承、多态

变量的初始化是指变量的第一次赋值

可在单个var语句中声明(并初始化)多个变量,用逗号隔开即可

var a,b,c='Hi',d;

1+2,1和2为操作数,+为运算符,1+2这个整体称为表达式

访问一个不存在的变量,或变量声明后未赋值,将会显示undefined,因为JS会自动在变量初始化前的值设为undefined,而undefined类型的值只有一个:undefined

JS有六种数据类型:number、string、boolean、undefined、null和object,任何不属于前面五种基本数据类型的值都会被认为是一个对象

typeof可能返回的结果有:

  • "number"
  • "string"
  • "boolean"
  • "undefined"
  • "object"
  • "function"

指数表示法,如2e1或者2e+1,都表示2的后面有1个0,而3e+3表示3的后面有3个0,即3000

也可以理解为小数点向后移动了3位,所以2e-1表示0.2

JS中有一种叫做Infinity的特殊值(注意i是大写),代表的是超出了JS处理范围的数值,但Infinity依然是一个数字,所以typeof Infinity返回的是“number”

注意:任何数除以0结果也为Infinity

Infinity表示最大值(或比最大值还大的数),而最小值为-Infinity

Infinity与任何数进行算术运算得到的结果仍为Infinity

Infinity - Infinity = NaN

NaN虽然意思是“Not a number”,但和Infinity一样,也是number类型。所以两者是特殊的数字

> var a = NaN;
> a;
NaN

NaN是有传染性的,若一个算术运算中存在一个NaN,则整个运算就会失败,也为NaN

将一个数字字符串进行算术运算时(+除外),该字符串会自动被转换成number类型,于是将数字字符串转换为数字就有了种偷懒的方法,与1相乘,当然更好的选择是使用parseInt()函数。若转换失败则结果是NaN

\u后面的字符会被视为unicode码如“\u0421\u0422”

如果对一个非布尔值执行逻辑运算,那该值会在计算过程中被转换成布尔值

> var b = 'one';
> !b
false

字符串“one”先自动被转换为布尔值true,然后再取反

另外,使用双重取反操作,可以很轻易地将任何值转换为相应的布尔值

逻辑运算符中,! 优先级最高,其次是&&,最后是||

** JavaScript 引擎在一个逻辑表达式中遇到一个非布尔类型的操作数,那么该操作数的值就会成为该表达式所返回的结果**

> true || "something";
true //短路或,前面为true,后面不再执行
> true && "something";
"something" //JS引擎在逻辑表达式中遇到非布尔类型的值,会将其作为该表达式的结果返回
> true && "something" && true;
true //返回最后一个执行的

通常情况下,这种行为应该尽量避免,因为它会使我们的代码变得难以理解

但在某些时候这样做也是有用的,如不能确定某个变量是否已经被定义时,如果变量 mynumber 已经被定义,就保留其原有值,否则就将它初始化。

> var mynumber = mynumber || 10; //若mynumber没被定义,则为undefined,所以相当于 false || 10
> mynumber;

和!=这两个比较运算符,在比较前两边的操作数会自动转换为对应的布尔值

而=和!==则不存在类型转换

NaN不等于任何东西,包括它自己,NaN==NaN为false

声明一个变量时没有对其进行赋值,调用该变量时并不会出错,但 typeof操作符依然会返回"undefined"

var somevar;
somevar; //变量的调用
typeof somevar;

null类型的值只有一个:null

typeof null结果为“object”

当进行算术运算时,undefined会被转换为NaN,而null为0

数组是用于存放数据的列表,可用来存储任意类型任意数量的元素

可通过索引一个之前不存在的位置,来添加数组元素,若新元素的位置与原数组末端有一定间隔,则这其中的元素会被自动设为undefined

可使用delete来删除元素,删除后原数组长度不变,该元素变为undefined

var a = [1,2,3];
delete a[1];
console.log(a); // [1,undefined,3]

可通过这种数组访问方式来获取字符串中特定位置的字符

检查变量是否存在

最懒的方法就是条件部分直接使用变量,如if(somevar){...}

但这样做并不一定是最合适的,首先若该变量不存在则会报错,其次就算somevar转换后是false,也不意味着该变量就一定没有定义,它可能是false或0

所以检查变量是否存在更好的选择是使用typeof

if(typeof somevar !== 'undefined'){ //typeof返回的是字符串,并且就算变量不存在,也不会报错

}

switch和case括号内都是表达式(一个变量也是表达式)

var x = 1, y = 1;
switch (x + y) {
case '2':
console.log('string');
case 1 + 1 :
console.log(23);
}

case表达式的结果将会与switch语句的表达式进行比较,只有全等才为true

尽量使用default语句,这可以在switch找不到任何匹配的情况下也依然返回一些有意义的结果

for-in往往用来遍历数组或对象,主要是对象

var a = ['a','b','c'];
for(var i in a){
console.log('index:' + i + ',value:' + a[i]);
}

遍历的是数组时,i是索引,遍历对象时,i是对象属性名

注释会被JS引擎自动忽略,所以不会对程序产生任何影响

函数

函数本质上是一种代码的分组形式,通过这种形式赋予某组代码一个名字,以便之后的调用

函数通常有返回值,若没有显式的返回值,则默认返回undefined

函数调用时可传递多个参数,会根据形参数去接收,多余的会被忽略,但每个函数都有内建的arguments对象,它能返回函数所接收的所有参数

JS有一组可随时调用的内建函数,这些预定义函数包括

  • parseInt()
  • parseFloat()
  • isNaN()
  • encodeURI()
  • decodeURI()
  • encodeURIComponent()
  • decodeURIComponent()
  • eval()

parseInt()会试图将收到的任何值转换成整数类型输出,转换失败则返回NaN

parseInt('123')  //123
parseInt('a123') //NaN,遇到第一个异常字母就会放弃无论剩下的部分字符串是否可用
parseInt('1a23') //1 //该函数还有可选的第二个参数,负责设定函数期望的数字类型,没有此参数则默认是十进制
parseInt('FF',10) //转换为十进制,NaN
parseInt('FF',16) //转换为十六进制,255

ES5移除八进制的默认表示法,也就是parseInt('0377')不会被认为是八进制0377

parseFloat()和parseInt()基本相同,但仅支持将输入值转换为十进制,所以该函数只有一个参数

isNaN()用来确定输入值是否是NaN,NaN或不是纯数字字符串都为true,除此之外则返回false,注意指数形式是纯数字,所以isNaN('2e1+1')为false

isNaN(123) //false
isNaN(-1.23) //false
isNaN(Infinity) //false
isNaN('Hi') //true
isNaN('123a') //true

isFinite()函数,Finite意思是“有限的”,所以此函数用来检测其参数值是否是有限大的数字,Infinity、-Infinity、NaN或不是纯数字的字符串都会返回false

isFinite(123) //true
isFinite(-1.23) //true
isFinite('Hi') //false
isFinite('123a') //false
isFinite(1e309) //由于1e309已超过Infinity,所以为false

在一些遗留代码中可能会看到相似的编码和反编码函数escape()和unescape(),但并不赞成使用这些函数来执行相关操作,它们的编码规则也不尽相同

alert()函数不是JS核心的一部分(即没有被包括在ECMA标准中),而是浏览器提供的。此函数会阻塞浏览器线程,即警告框关闭前,当前所有代码都会暂停执行

变量的定义可考虑使用“单一var”模式,即仅在函数第一行使用一个var来定义这个作用域中所有的变量,这样一来我们就能很轻松地找到相关变量的定义并且在很大程度上避免了不小心污染全局变量的情况

「JavaScript面向对象编程指南」基础的更多相关文章

  1. 「JavaScript面向对象编程指南」对象

    对象的属性名可加上引号,下面三行代码所定义的内容是完全相同的 var hero = { occupation : 1 }; var hero = { "occupation" : ...

  2. 「JavaScript面向对象编程指南」原型

    在 JS 中,函数本身也是一个包含了方法(如apply和call)和属性(如length和constructor)的对象,而prototype也是函数对象的一个属性 function f(){} f. ...

  3. 「JavaScript面向对象编程指南」闭包

    闭包 JS只有函数作用域,函数外为全局变量,函数内为局部变量 绿圆是函数fn的作用域,在这范围内可访问局部变量b和全局变量a,橙圆是fn内部函数inner的作用域,此范围内可访问自身作用域内的变量c, ...

  4. 《JavaScript面向对象编程指南(第2版)》读书笔记(一)

    目录 一.对象 1.1 获取属性值的方式 1.2 获取动态生成的属性的值 二.数组 2.1 检测是否为数组 2.2 增加数组长度导致未赋值的位置为undefined 2.3 用闭包实现简易迭代器 三. ...

  5. 《JavaScript面向对象编程指南(第2版)》读书笔记(二)

    <JavaScript面向对象编程指南(第2版)>读书笔记(一) <JavaScript面向对象编程指南(第2版)>读书笔记(二) 目录 一.基本类型 1.1 字符串 1.2 ...

  6. 《JavaScript面向对象编程指南》读书笔记②

    概述 <JavaScript面向对象编程指南>读书笔记① 这里只记录一下我看JavaScript面向对象编程指南记录下的一些东西.那些简单的知识我没有记录,我只记录几个容易遗漏的或者精彩的 ...

  7. 《JavaScript面向对象编程指南》读书笔记①

    概述 JavaScript快忘完了,想看一本专业书拾遗,所以看了这本<JavaScript面向对象编程指南>. 个人觉得这本书讲的很透彻很易懂,一些原来有疑惑的地方在这本书里面豁然开朗,看 ...

  8. 闭包初体验 -《JavaScript面向对象编程指南》

    下面是我对闭包的理解:(把他们整理出来,整理的过程也是在梳理) 参考<JavaScript面向对象编程指南> 1.首先,在理解闭包之前: 我们首先应该清楚下作用域和作用域链 作用域:每个函 ...

  9. 《JavaScript面向对象编程指南》

    第一章.引言 1.5 面向对象的程序设计常用概念 对象(名词):是指"事物"在程序设计语言中的表现形式. 这里的事物可以是任何东西,我们可以看到它们具有某些明确特征,能执行某些动作 ...

随机推荐

  1. ABP之Caching

    简介 ABP提供缓存抽象,默认使用MemoryCache.但是可以替换成其他缓存程序,比如 Abp.RedisCache 是使用Redis实现缓存. ICacheManager 缓存的主要接口是ICa ...

  2. openstack基础框架

    openstack组件:     Computer--代码名Nova,管理VM的整个生命周期,主要职责包括启动,调度VMs,计算节点上需要至少两块网卡     Networking--代码名Neutr ...

  3. CSS中的opacity,不透明度的坑

    opacity的用法示例如下 /* 值是0到1之间的数值 */ opacity:0.5 opacity设置在元素上的时候,会出现什么效果? 答曰:如果不设置opacity的话,会显示效果为A(可以理解 ...

  4. [转帖]Oracle 补丁体系(PSR/PSU/CPU) 及 opatch 工具 介绍

    Oracle 补丁体系(PSR/PSU/CPU) 及 opatch 工具 介绍 原文:http://blog.csdn.net/tianlesoftware/article/details/58095 ...

  5. Django(三) ORM 数据库操作

    大纲 一.DjangoORM 创建基本类型及生成数据库表结构 1.简介 2.创建数据库 表结构 二.Django ORM基本增删改查 1.表数据增删改查 2.表结构修改 三.Django ORM 字段 ...

  6. element 给table的个别表格框添加样式 ---重构里面的组件

    <el-table ref="singleTable" :show-header='false' :data="tableData" align='cen ...

  7. python——redis

    redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sor ...

  8. python3 实例方法、类方法和静态方法

    #!/usr/bin/env python3.6 #-*- coding:utf-8 -*- # class Person(object): city = 'Beijing' def __init__ ...

  9. 一文入门HTML5

    1.HTML5 上节回顾:一文读懂ES6(附PY3对比) | 一文入门NodeJS 演示demo:https://github.com/lotapp/BaseCode/tree/master/java ...

  10. HTTP与HTTPS(转)

    一.什么是HTTP? 什么是HTTPS?  HTTP:(Hyper Text Transfer Protocol 超文本传输协议) HTTPS:(Hyper Text Transfer Protoco ...