一 JavaScript 简介
1 JavaScript基本介绍
1 JavaScript 简称JS,是一种动态的弱类型脚本解释型语言,和HTML,CSS并成为三大WEB核心技术,得到了几乎所有主流浏览器的支持
2 JavaScript 历史
1994年,网景Netscape公司成立并发布了Netscape navigator浏览器,占据了很大的时长份额,网景意识到WEB需要动态,需要一种技术来实现
1995年9月网景浏览器2发布测试版本发布了livescript,随即在12月的测试版就更名为JavaScript,同时期,微软推出IE并支持JScript,VBScript。
1997年,网景,微软,SUN,borland公司和其他组织在ECMA确定了ECMAscript语言标准,JS则是ECMAscript的标准实现之一。
由于IE的捆绑销售行为,网景的单一浏览器时长萎缩,从1990年的90%下降到2006年的1%,1999年网景被AOL收购,收购不就,netspace公开了浏览器代码,并创建了Mozilla组织,Mozilla组织使用Gelo引擎重写浏览器,当然Mozilla将Geko引擎发布了Firefox浏览器
2003年5月,网景被解散
AOL于2007年宣布停止支持Netscape浏览器
3 网景的技术
HTTP cookie ,解决HTTP无状态
JavaScript
ssl协议
jar 格式文件,将Java的class文件打包,并加上签名
2012年4月9日,微软以10亿5千6百万购买800向美国在线的专利或专利授权,并收购了SSL,cookie等专利。
4 ES
ES,ECMAScript是由ECMA国际(前身为欧洲计算机制造协会,英文名称是European Computer Manufactures Association)通过ECMA-262标准化的脚本程序设计语言,该语言被广泛应用于互联网
JavaScript是商品名,目前商标权在Oracle公司手中,ES是标准名。
根据ES标准,有很多实现引擎,其中包括JavaScript或JScript,他们都是ECMA-262标准的实现和扩展。
1997年,制定了首个ECMA-262
1999年12月,EC3,支持更强大的正则表达式
ES4 太过激进,最终被放弃
2009年,ES5发布,得到广泛支持,支持严格模式,支持Json
2015年,ES6发布,引入非常多的新的语言特性,还兼容旧版本的特性,ES6之前按照版本号命名,从ES6开始使用年份作为版本号,ES6 及ECMAscript 2015.
5 之前浏览器中兼容问题
运行HTML,CSS,JS技术都在发展,标准版本很多,浏览器内嵌的引擎实现不太一致,甚至有不按照标准实现,或者减少实现,或者改变实现,或者增加的功能,如IE,就导致了开发人员负担,很难做到一套代码可以兼容的跑在多种浏览器中,甚至不能跑在同一种浏览器的不同版本中。
6 V8 引擎
就在浏览器IE一家独大时,Firefox和Chrome开始变强
2008年9月2日,Google的Chrome浏览器发布,一并发布的js引擎,就是V8引擎,V8使用BSD协议开源
V8引擎支持C++开发,将JavaScript编译成了机器码,而不是字节码,还是用很多优化方式提高性能,因此,V8引擎速度很快。
V8 引擎还可以独立运行,可以嵌入到其他任何C++程序中。
V8 引擎的诞生,使得服务器端运行JS称为了方便的事情。
7 Nodejs
nodejs是服务器端运行JavaScript的开源的,跨平台的运行环境
nodejs原始作者瑞安达尔于2009年发布,使用了V8引擎,并采用事件驱动,非阻塞异步IO模型
2010年,npm软件包管理器诞生,通过它,可以方便的发布,分析nodejs的库和源代码。
nodejs4.0引入了ES6的语言特性。
8 安装组件
需要安装nodejs和visual studio code
相关下载
nodejs
https://npm.taobao.org/mirrors/node/v12.10.0/node-v12.10.0-x64.msi
visual studio code
https://vscode.cdn.azure.cn/stable/b37e54c98e1a74ba89e03073e5a3761284e3ffb0/VSCodeUserSetup-x64-1.38.1.exe
插件NodeExec和汉化包安装
重新启动软件即可生效,
二 JavaScript基础
1 注释,常量,变量
1 注释
和C 、Java一样
//单行注释
/*注释*/多行注释,也可以使用在语句中
注: 使用快捷键F8运行代码,其代码必须是已经保存的文件,不能是空,F8可能和有道词典快捷键冲突,建议在此运行期间不运行有道词典。
2 常量和变量
1 标识符
标识符必须是字母,下滑线,美元符号和数字,但必须是字母,下划线,美元符号开头,依然不能是数字开头
标识符区分大小写
2 标识符的声明
var 声明一个变量
let 声明一个块作用域中的局部变量
const 声明一个常量
JS中的变量声明和初始化时可以分开的
常量的存放位置和变量是不在一起的
console.log(a) // 后面声明的变量,前面可以使用,但没意义
var a //只是声明,并未赋值,其类型是undefined,
let b //声明为块变量
console.log(1,a,b) //打印
a=1 //变量赋值,不规范化操作,不推荐,在严格模式下回导致异常。在赋值之前不能引用,因为未为进行声明,其赋值的结果是全局作用域
b='123'
console.log(2,a,b)
const c=100 //定义常量
console.log(c)
var d=10 //规范声明并初始化
console.log(3,d)
c=200 //修改常量值,不可修改,因为其是常量
console.log(4,c)
结果如下
常量和变量的选择
如果明确知道一个标识符定以后便不再改变,应该尽量声明成const常量,减少被修改的风险,减少bug。
3 函数对作用域的控制
function test(){
var x=10; //声明并初始化x
y=20; //声明vi能够初始化y
console.log(x,y)
} 郑州男科医院:http://mobile.tongji120.com/郑州男科医院哪家好:http://mobile.tongji120.com/郑州同济做包皮手术多少钱:http://mobile.tongji120.com/
test()
console.log(x,y) //此处在函数中,其所有参数皆不能冲破作用域
// x=100
// console.log(x)
结果如下
函数本身天生就是一个作用域
4 提升作用域
其实就是将声明定义到最前面罢了,及就是先调用,再定义
console.log(a)
console.log(b)
console.log(c)
console.log(d)
console.log(e)
var a=200; // 提升作用域,只有var定义变量的方式可以提升作用域
var b;
const c=300; //此处不能提升作用域
let d;
e=300;
结果如下
2 数据类型
1 基本数据类型介绍
序号名称说明
1number数值型,包括整数类型和浮点型
2boolean布尔型,true和false
3string字符串
4null只有一个值null
5undefined变量声明未赋值的,对象未定义的属性
6symbolES6新引入的类型
7object类型是以上基本类型的复合类型,是容器
ES是动态语言,弱类型语言
虽然先声明了变量,但是变量可以重新赋值成任何类型
2 类型转换
1 字符串类型转换
console.log(a=1+'test',typeof(a)) // typeof:打印类型
console.log(a=false+'test',typeof(a)) //和布尔类型运算
console.log(a=null+'test',typeof(a)) //和null比较
console.log(a=true+'test',typeof(a))
console.log(a=undefined+'test',typeof(a)) //和数字
结果如下
2 数字类型转换
console.log(a=1+false,typeof(a))
console.log(a=1+true,typeof(a))
console.log(a=1+null,typeof(a))
console.log(a=1+undefined,typeof(a))
结果如下
3 布尔类型转换相关
console.log(a=false+undefined,typeof(a))
console.log(a=true+undefined,typeof(a))
console.log(a=false+null,typeof(a))
console.log(a=true+null,typeof(a))
console.log(a=true & '',typeof(a)) //位运算
console.log(a=undefined && true,typeof(a)) //与运算
4 短路
True是透明的,false则直接就是短路,返回直接就是false,类型是布尔。true主要是看后面的情况
console.log(a=false && null,typeof(a)) //如果前面是false,则返回结果是false,且类型是布尔类型
console.log(a=false && 'zhangbing',typeof(a))
console.log(a=true && '32534534',typeof(a)) //如果前面是true,则以后面为准
console.log(a=true && '' ,typeof(a))