做者:Brendan Eichjavascript
1.shell部分(也就是咱们顾名思义的外壳)php
2.内核部分java
2.1.渲染引擎(语法规定和渲染)python
2.2.js引擎es6
2.3.其余模块正则表达式
2008年Google发布最新浏览器Chrome,它是采用优化后的javascript引擎,引擎代号V8,因能把js代码直接转化为机械码来执行,进而以速度快而闻名。shell
ChromeV8引擎是由c语言编写的 v8引擎直接能够将内容转换成0,1的数字,因此Chrome比任何浏览器都要快,若是没有v8引擎须要将汇编语言转成成C语言在转换成javascript语言。数组
编译语言(C,C++)浏览器
特色:先所有解释,在所有执行。jvm
优势:快
缺点:移植性很差(不能跨平台)
解释性语言(Javascript,php,python)
特色:解释一行,执行一行
优势:跨平台
缺点:稍微慢一点
另外注意的一点就是java与其余的语言是不一样的,它历史叫作oak语言
解释方式:.java文件 -> 经过javac命令 -> 编译 -> .class文件 -> jvm虚拟机解释执行
一、解释性语言(不须要编译成文件,跨平台)
二、单线程
js三大部分:ECMAScript,DOM,BOM
变量(variable)
变量声明 var a = 1;
变量赋值 a = 1;
命名规则
一、变量名必须以英文字母,_,$开头
二、变量名能够包括英文字母、_、$、数字
三、不能够用系统的关键字、保留字做为变量名
js中的保留字和关键字
1.原始值(stack栈,不可改变的)先进后出
Number(数字),String(字符串),Boolean(布尔值),undefined(undefined),null(空,占位符)
特色:拷贝的数,不影响其余的值
例如:var a = 10;
b = a;
b = 20;
console.log(b) // 20
2.引用值(heap堆)
Array(数组),Object(对象),function(函数),Date(日期),RegExp(正则表达式)
特色:拷贝的是地址,影响其余的值
例如:var arr = [1,2];
arr1 = arr;
arr1.push(3);
console.log(arr) // 1,2,3
以下图一cst和zx指向的是同一个地址,因此只要改变就会发生变化。
以下图二 a 赋值给b 是拷贝了一个副本,以后b在发生变化,和a没有任何关系
图一
图二
js语句基本规则
语句后面要用分号结束“;”
js语法错误会引起后续代码终止,但不会影响其它js代码块
书写格式要规范,“= + / -”两边都应该有空格
运算操做符
“+”
1.数学运算、字符串连接
2.任何数据类型加字符串都等于字符串
“-”,“*”,“/“,“%”,”=“,“()”
优先级”=“最弱,”()”优先级较高
“++”,“- -”,”+=“,“-=”,“/=“,“*=”,“%=”
被认定为假的六个值:
undefinnde,null,false,null,0," "
逻辑运算符:
&&:先看第一个表达式转换成布尔值的结果,若是结果为真,那么它会看第二个表达式的结果转换成布尔值的结果(undefined,null,false,null,0,
" "这些值都是false),而后若是只有两个表达式的话,只看到第二个表达式就能够返回该表达式的结果了。若是第一个为false,就能够直接返回false了。
||:只有有一个表达式为真就返回真。
! :取反字符
for循环的底层原理:
for(var i = 0; i < 10; i++){}的实现
第一步:var i= 0;
第二步:if(i < 10){
console.log('a')
}
第三步:i++;
第四步:if(i < 10){
console.log('a')
}
......
注意若是for循环只写中间的一个条件,那么就是while循环
for(;i < 10;){} === while(i < 10){}
switch,case语句至关于if{}else{}
如:
if(a == 10){
console.log(10)
}else if(a == 20){
console.log(20)
}
换成switch,case
switch(a){
case 10 :
return 10;
case 20:
return 20;
}
还有一点须要注意的一旦用了return 后面的代码就不会执行了,就不用break了
二:typeof
首先须要知道typeof可以,且只可以返回的六种类型
number,string,boolean,object,function,undefined,这些结构以前已经解释过了,就不一一解释了。
类型转换:
显示类型转换:
Number:强行转换成数字类型,注意的是undefined不能转换成数字
parseInt:转换成整型,其余的NaN,会转换成Number类型,从数字最后一位开始截取下来。如 typeof('123abc') // number 123;
另一点:parseInt(num,radio) -> radio为基地转换成10进制的数
parseFloat:转换成浮点型,并保留一位小数;
string:转换成字符串,写什么都是字符串;
boolean:转换成布尔值,除了" ",其余都是为true;
toString:也是转换成字符串,和string的区别在于用法不一样,(undefined,null)不可用toString这个方法;
另一点:toString()括号内能够跟目标进制的数
隐式类型转换:
isNaN -> Number()
++/ -- +/-(一元正负运算符) -> Number()
+ 加号 -> String()
*/% -> Number()
&& | ! -> Number()
注意 !== 和 === 不发生类型转换
3、函数
1.初始函数:
定义方式:
函数声明:function (){}
函数表达式:
命名函数表达式:var test = function test() {}
匿名函数表达式(也称为函数表达式):var test = function () {}
实参和形参
例如:function test(a,b) {console.log(a,b)} test(1,2) //a,b称为形式参数,简称为形参; 1,2称为实际参数,简称为实参;
注意:函数function test(a,b){至关于隐式的var a,b;}
查看形参的长度:test.length(函数名的长度)
查看形参的长度:arguments.length(实参列表)
重点:函数里面的实参和形参存在映射的关系,只要其中它们有一个发生了变化另一个也会发生变化,即便它们都是原始值,这是函数的特性
若是形参的长度大于实参的长度多出来的位数不会发生映射的关系。
另外的一个知识点,return:
(1)若是没有写return,则在函数的最后系统会自动帮你加上return,就比如没有写分号同样
(2)若是写了return,下面的代码则不会继续执行了.return返回的必须定义了容器来接收它,否则不会显示。
2.预编译:
大部分人都会记住两句话叫作:
(1).函数声明总体提高 意思是:函数声明无论在哪里调用都是好使的.
例如: test() //1 function test(){console.log(1)} 就算在前面执行依然可以打印出1
(2)变量 声明提高 注意了这句话须要分开来读 变量 声明提高 而不是 变量声明提高 什么意思呢? 是这样的:
例如 var a = 10;这叫作变量声明 若是你在以前打印 a 会出现undefined 为何会这样呢 由于系统内部只会把 var 提早到最顶端 而赋值语句
不会提高到最顶部 这也是JavaScript语言的特色,因此会出先undefined。
注意点: 无论在全局仍是在局部声明变量,必需要经过 var,let(这是es6会学到的)来声明否则归window全部。
例如:function test() {var a = b = 10} test() console.log(window.b,window.a) //10,undefined 由于b是没有进行变量声明获得的值因此归
window全部 而a就是经过变量声明来的值,因此window上面是访问不到的.这个b也可能叫作"暗示全局变量"
预编译是发生在函数执行的前一刻(四部曲):
(1):建立AO对象(Activation Object)又称为执行期上下文。
(2):找形参和变量声明,将变量和形参名做为Ao的属性名,值为undefined.
(3):将实参和形参相统一.
(4):在函数体里面找函数声明.值赋予函数体
写一个小例子就懂了:
function fn(a){
console.log(a);
var a = 123;
console.log(a);
function a() {}
console.log(a)
var b = function () {}
console.log(b)
function d(){}
}
fn(1)
这个例子若是你只知道以前两句话是解不出来的,那咱们就一步一步的分析一下吧。
第一步建立Ao对象:
AO{}
第二步找形参和变量声明,值为undefined
AO{a:undefined,b:undefined}
第三步将实参和形参相统一
AO{a:1 b:undefined}
第四步找函数声明 注意是 functio test() {} 而不是 var test = function () {}
AO{a:function a(){},b:undefined,d:function d() {}}
因此值为// function a() {},123,123,function (){}
3.做用域:
[[scope]]:每一个javascript函数都是一个对象,对象中有些属性咱们能够访问,但有些不能够,这些属性仅供javascript引擎存取,
[[scope]]就是其中一个。[[scope]]指的就是咱们所说的做用域,其中存储了运行期上下文的集合。
运行期上下文:当函数执行时,会建立一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数执行时的环境,
函数每次执行时对应的执行上下文都是独一无二的,因此屡次调用一个函数会致使建立多个执行上下文,当函数执行完毕,执行上下文被销毁。
查找变量顺序:从做用域链的顶端依次向下查找。
看图解释:
a函数在定义的时候产生一个Go(global object)放到做用域的最顶端。
a函数在执行的前一刻,也就是咱们所说的预编译过程,建立一个执行期上下文对象放到做用域的最顶端。
b函数在建立的时候,直接能够拿到a函数的劳动成果放到本身做用域的最顶端。
b函数执行生成一个执行期上下文,放到本身做用域最顶端,而后将a的劳动成果依次向下,须要注意的点
看图中的标注
上面的图解是做用域的大体流程。
在写一个小的实例:
function a() {
function b() {
function c() {
}
c()
}
b()
}
a()
执行过程:
a 定义 a.[[scope]] -> 0 : Go
a 执行 a.[[scope]] -> 0 : aAo
1 :Go
b 定义 b.[[scope]] -> 0 : aAo
1 : Go
b 执行 b.[[scope]] -> 0 : bAo
1 : aAo
2 : Go
c 定义 c.[[scope]] 0 : bAo
1 : aAo
2 : bAo
c 执行 c.[[scope]] 0 : cAo
1 : bAo
2 : aAo
3 : Go
以上就是函数的执行顺序,也解释了为何函数内部能够访问到外部的变量,而外部不能够访问到内部的变量
致使报错,也就比如 儿子能够问父亲要钱 能够问爷爷要钱,可是反过来是否是不行啊。