《JavaScript高级程序设计》__杂记

  • 文档对象模型DOM

    提供访问和操作页面内容的方法和接口
  • 浏览器对象模型BOM

    提供与浏览器交互的方法和接口
  • ECMAScript,提供核心语言功能


<script></script>元素 一般 引用放在<body>元素中页面的内容后面


javascript语法类似类C语言(java和perl),区分大小写,语句以分号结束
变量 可以保存任何类型的数据
var操作符定义,当函数被调用时,就会创建该变量并为其赋值,不用就会被销毁
省略var,从而创建全局变量


  • 数据类型

  • 基本类型
    字符串(String)
    数字(Number)
    布尔(Boolean)
    数组(Array)
    空(Null)
    未定义(Undefined)

  • 引用类型
    对象(Object)

    typeof操作符(检测变量的数据类型) :
    typeof 37 === 'number';


  • undefined类型

使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。所以当提示变量undefined时候就是告诉我们这个变量还没有初始化。


  • null类型

值:null 空对象指针(object)
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null。

typeof null==="object"//true

if(car!null){
//对car进行某些操作
}```

  undefined派生自null值,但他们的用途完全不同。
  alert(null==undefined);//true
***
* #####boolean类型
值:true和false
true不一定等于1,而false也不一定等于0
把其他类型中的值(与boolean等价的)转换成boolean: `boolean()`
***
* #####number类型( 整数和浮点数值)
##`整数`
 十进制数值是最基本的数值字面量格式,八进制的字面量在严格模式下是无效的
在进行计算时,八进制和十六进制最终都会转变成十进制数值
##`浮点数值`
该数值中必定包含一个 小数点,并且小数点后面必须有一位数字,浮点数值得保存空间
是整数值的两倍,es会不失时机地把浮点数值转换成整数值。
## `数值范围`
最小:Number.MIN_VALUE
最大值:Number.MAX_VALUE
如果超出数值范围,转化成infinity值(-infinity负无穷),`iFinite()`函数确认一个数值是不是有穷的
## `NaN 非数值`
      NaN(Not a number)与任何值不相等,包括他本身
`isNuN()`函数确认这个参数是否“非数值”
##`数值转换`
把非数值转换成数值:
`Number()` 任何数据类型

  字符串转换成数值:
`parseIn()`
`parseFloat() `

  对象:
`valueOf()`  `toString()`
***
* #####String类型
字符字面量(转义序列),字符串一旦创建,他们的值就不能改变。
转为字符串:`toString()`
***
* #####对象
object类型,一组数据和功能的集合
object类型是所有它的实例的基础。
***
* #####操作符
运算操作符
位操作符
关系操作符
相等操作符

  ## `一元操作符`
递增`++`和递减操作符` --`
前置递减和后置递减的差别,操作在包含他们的语句被求值之后才执行的

  ## `布尔操作符`
逻辑非 `!`
逻辑与` && ` 两者同时
逻辑或 `|| `
乘性操作符  乘法` *`  除法 `/` 求模(于)`%` 

  ##  `加性操作符`
加法 `+`
          `操作数是字符串时:
          如果两个两个操作数都是字符串,则拼接
          如果有一个是字符串,则将另一个操作数转换成操作数,然后拼接`
减法` -`

  ## `关系操作符`
大于 `>`  小于 `<`  大于等于 `>=` 小于等于`<=`
字符串比较的是字符编码
数值和字符串相比较的时候,字符串会变转成数值,然后再比较。
 `任何操作数和NaN相比较,结果都是false。`

  ## `相等操作符`
相等和不相等--先转换再比较
``` var  result =('22'==22) //true 转换后相等```
全等和不全等--仅比较而不转换
```var result=('22'===22)//false 因为不同的数据类型,所以不全等```
相等 `==`
不相等`!=`
全等`===`
不全等`!==`

  ## `条件操作符`
```variale=boolean_experssion?true_value:false_value```

  ## `赋值操作符`
把右侧的值赋给左侧
var num=10;

  ## `逗号操作符`
var num1=1,num2=2,num3=3;
逗号操作符还可以用于赋值,逗号操作符总会返回表达式中的最后一项,如下面:
var num=(1,2,2,3,4,5)//num的值为5

***
* #####语句
  ## `if语句`
推崇用代码块,即使只有一行代码
```javascript 
if (条件)
  {
  当条件为 true 时执行的代码
  }
else
  {
  当条件不为 true 时执行的代码
  }

while语句

前测试循环语句

while (条件)
  {
  需要执行的代码
  }

do-while

语句后测试循环语句

do
  {
  需要执行的代码
  }
while (条件);

在对表达式求值之前,循环体内的代码至少被执行一次

for语句

(前测循环语句)具有在执行循环之前初始化变量和定义循环后要执行的代码的能力。

var count =10 ;
for(var i=0;i<count;i++){
alert(i)
}```
for循环只是把与循环有关的代码集中在一个位置。

  ## `for-in语句`
for-in语句是一种精准的迭代语句,可以用来枚举对象的属性(遍历对象属性)

var person={fname:"John",lname:"Doe",age:25};
for (x in person)
{
txt=txt + person[x];
}

枚举在C/C++/c#中,是一个被命名的整型常数的集合。
label语句可以在代码中添加标签,以便将来使用。
## `break语句`
break语句立即退出循环,强制继续执行循环后面的语句

for (i=0;i<10;i++)
{
if (i==3)
{ break }
x=x + "The number is " + i + "
";
}

## `continue语句`
continue虽然也是立即退出循环,但是退出循环后会从循环的顶部继续执行

for (i=0;i<=10;i++)
{
if (i==3) continue;
x=x + "The number is " + i + "
";
}```

with语句

将代码的作用域设置到一个特定的对象中,严格模式下不允许使用with语句,否则将视为语法错误。
switch语句,一种流控制语句
default,相当于一个else语句
可以在switch语句中使用任何数据类型,每个case的值不一定是常量,也可以是变量、表达式。


  函数可以封装任意多条语句,而且可以在任何地方、任何时候调用执行。

无须指定函数的返回值,因为任何函数都可以在任何时候返回任何值
return()位于return语句之后的任何代码都永远不会执行,一个函数可以包含多个return语句。
未指定返回值的函数返回的是一个特殊的undefined值。
函数没有重载,如果定义两个名字相同的函数,则改名字只属于后定义的函数。


  • 基本类型和引用类型的值

引用类型的值是保存在内存中的对象
动态的属性

person.name(属性)="Nicholas"(字符串值)``
我们不能给基本属性的值添加属性

 ## `复制变量值`
当一个变量向另一个变量复制引用类型的值时,同样也会将存储在变量对象中的值复制一份到新的变量分配空间中,两个变量实际上将引用同一个对象,因此改变其中一个变量,就会影响另一个变量。

 ##`传递参数`
局部变量和全局变量
参数按照引用传递

 ## `检测类型`
测试变量是不是基本数据类型 typeof操作符  
如果变量的值时一个对象或null,检测类型是object

 `想知道是什么类型的对象用 instanceof`
ex:person instanceof Object如果变量是给定引用类型,则返回true,如果检测基本类型的值,则返回false,因为`基本类型不是对象`
***
* ###执行环境及作用域
`所有变量(包括基本类型和引用类型)都存在于一个执行环境(也称为作用域)当中,
这个执行  环境决定了变量额声明周期,以及那一部分代码可以访问其中的变量。`
执行环境定义了变量或函数有权访问的其他数据,决定他们各自的行为。
## `变量对象`
执行环境的类型总共只有两种,全局和局部(函数)
全局执行环境是最外围的一个执行环境,知道应用程序退出才会被销毁。
每个函数都有自己的执行环境。当执行流进入一个函数时,函数的环境会被推入到一个环境栈中,执行之后,栈将其环境退出,把控制权返回给之前的执行环境。

 ## `延长作用域链`
catch语句,创建一个新的变量对象
with语句

## `没有块级作用域`
if语句:if语句中的变量声明会将变量添加到当前的执行环境
for语句:for语句初始化变量的表达式所定义的变量即使在for循环结束后,依旧会存在于循环外部的执行环境中。
     ## `es6有块级作用域`

 ## `声明变量`
使用var声明的变量会自动添加到函数的局部环境中;如果__初始化__没有使用var声明,该变量会自动变添加到全局环境。

  ## `查询标识符`
***
* #####垃圾收集`
执行环境会负责管理代码执行过程中使用的内存。
局部变量只在函数执行的过程中存在 

 `标记清除
引用计数
性能问题
管理内存`

 __基本类型值__在内存中占据固定大小,因此被保存在栈内存中;
从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本。

 __引用类型值__是对象,保存在堆内存中。`
包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针。
****

* #####引用类型
引用类型的值(对象)是引用实例的一个实例。
引用类型是一种__数据结构__,用于将数据和功能组织在一起,有时候也被称为对象定义,因为他们描述的是一类对象所具有的属性和方法。

新对象是使用new操作符后跟这个一个构造函数来创建的。
1.  ``` javascript
    var person = new Object();```
2.对象字面量表示法(key value)

var person={
"name":"hello"
"age":20;
};```
里面的属性名会自动转换成字符串

访问对象属性:

点表示法
person.name
括号表示法
person["name"]


  • Array类型

数据的有序列表,数据的每一项可以保存任何类型的数据
var colors = new Array(20);//长度为20的数组
var colors = new Array("red","blue","green");
可选择省去new

  • 数组字面量表示方法

var colors=["red","blue"]

* 检测数组
`Array.isArray() `确定某个值到底是不是数组
*转换方法
`toLocaleString()` `toString()` `valueOf()`

  ## `栈方法`
栈是一种LIFO(LAST-IN-FIRST-OUT*__后进先出__*)的数据结构,也就是最新添加的项最早被移除。
而栈中项的插入(推入)和移除(弹出),只发生在栈的顶部。
`push()`接收任意数量的参数,把他们逐个添加到数组末尾,并返回修改后数组的长度。
`pop()`从数组的末端移除最后一项,减少数组的length值,然后返回移除项

  ##`列队方法`
列队数据结构的访问规则是FIFO(FIRST-IN-FIRST-OUT*__先进先出__*)列队在列表末端添加项,从列表的前端移除项。
  模拟列队
  `push()`末端添加 
`shift()`前端删除  取得第一项删除
  `unshift()`前端添加
`pop()`末端删除

  ##`重排序方法`
  `reverse() `反转数组顺序
`sort()`比较的是字符串
接收一个比较函数作为参数,以便我们指定那个值位于那个值的前面。

  ##`操作方法`
  `contat()`方法可以基于当前数组中的所有项创建一个新数组。
`slice()`方法slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分,可以基于当前数组中的一或多个项创建一个新的数组。如果只有一个参数的情况下,slice()方法返回从该参数指定位置开始到当前数组末尾的所有项。如果有两个参数,该方法返回起始和结束位置之间的项,但不包括结束位置的项。
```javascript
      <script type="text/javascript">
      var str="Hello happy world!"
      document.write(str.slice(6,11));//happy
      </script>

splice()方法主要用途是向数组的中部插入项
删除、插入、替换

位置方法

两个方法都接收两个参数:要查找的项和(可选的)表示查找起点位置的索引
indexOf()从数组的开头开始向后查找
lastIndexOf()则相反

迭代方法

每一项上运行的函数和运行该函数的作用域对象
every()filter()forEach()map()some()

缩小方法

迭代数组所有项
缩小数组的方法 接收两个参数:一个在每一项上调用的函数和(可选的)作为缩小基础的初始值,函数接受四个参数:前一个值、当前值、项的索引和数组对象
reduce()从数组的第一项开始遍历
reduceRight()从数组的最后一项开始遍历


  • Date类型
var now = new Date();```

`Date.parse()` 接收一个表示日期的字符串参数,并返回相应的毫秒数
`Date.UTC()`(一月是0)

  ##`继承的方法`

##`日期格式化`
##`日期/时间组件方法`
***
* #####RegExp类型
用来支持__正则表达式__
Perl
```javascript
var experssion =/pattern(模式)/flags(标志);```
3个标志:
`g`:全局模式
`i`:不区分大小写的模式
`m`:多行模式
      `一个正则表达式是一个模式和3个标志的组合体`
模式中所使用的所有元字符都必须转移
`([{\^$|)?*+.]}`

****

* #####Function类型
      `函数实际上是对象。`

* 函数本身就是变量,所以函数也可以作为值来使用,可以像传递参数把一个函数传递给另一个函数,而且可以将一个函数作为另一个函数的结果返回 

  ##`函数内部属性`
两个特殊的对象:`arguments`和`this`

  ##`callee属性,阶乘函数(递归算法)`
__this__引用的是函数数据以执行的环境对象
函数名字仅仅是一个包含指针的变量而已

  ##`函数属性和方法`
属性:length(函数希望接受命名参数的个数)
__prototype__是保存引用类型所有实例方法的真正存在。prototype是不可枚举的,因此使用for-in无法发现
`apply()` 
 `call()`
 `bind()`

  ##`基本包装类型`
作用域的两个内置对象:  `Global` 和`Math`
Global--window对象
Math对象 辅助完成复杂的数学计算法

  ##`面向对象`
修改属性默认的特性:`object.defineProperty()`,如果不指定特性的默认值,都是false
访问器的属性
getter setter

  定义多个属性
`Object.defineProperties()`

  读取属性的特性
`Object.getOwnPropertyDescriptor()`
***
* #####创建对象

* 工厂模式 
用函数来封装以特定接口创建对象的细节,可以无数次的调用这个函数。

* 构造函数模式,创建特定类型的对象
构造函数始终以一个大写字母开头,而非构造函数则以一个小写字母开头
构造函数本身也是函数,只不过可以用来创建对象
      `任何函数,只要通过new操作符来调用,那它就可以作为构造函数`

  ##`函数表达式`
  ##`函数声明`
  ##`函数声明提升`
执行代码之前会先读取函数声明
`function funName(){}`可以 

  ##`函数表达式(匿名函数/拉姆达函数)`
使用函数之前需要先赋值
```javascript
  var funName=function(arg0,arg1,arg2){}```
***
* #####递归
递归函数是在一个函数通过名字调用自身的情况构成的。
arguments.callee是一个指向正在执行的函数的指针,在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会导致错误
***
* #####闭包
闭包是指有权访问另一个函数作用域中的变量的函数(在函数内部创建另一个函数),闭包就是能够读取其他函数内部变量的函数,是将函数内部和函数外部连接起来的一座桥梁

  每次定义一个函数,都会产生一个作用域链(scope chain)。当JavaScript寻找变量varible时(这个过程称为变量解析),总会优先在当前作用域链的第一个对象中查找属性varible ,如果找到,则直接使用这个属性;否则,继续查找下一个对象的是否存在这个属性;这个过程会持续直至找到这个属性或者最终未找到引发错误为止
***
* #####关于this对象
      在全局函数中,this等于window,而当函数作为某个对象的方法调用的时候,this等于那个对象。
匿名函数的执行环境具有全局性,因此其this对象通常指向window。
`parameter`是指函数定义中参数,而`argument`指的是函数调用时的实际参数。
parameter=形参(formal parameter), argument=实参(actual parameter)。

    `Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。`

        在函数内部没有var的变量是全局变量。

* 待续
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容