文章目录
Nodejs
- Nodejs是服务器端运行JavaScript的开源、跨平台运行环境。
- Nodejs原始作者瑞安·达尔(Ryan Dahl),于2009年发布,使用了V8引擎,并采用事件驱动、非阻塞、异步IO模型。
- 2010年,npm软件包管理器诞生,通过它,可以方便的发布、分享Nodejs的库和源代码。
- Nodejs 4.0引入了ES6语言特性
安装Nodejs
直接到阿里云镜像站下载即可
https://npm.taobao.org/mirrors/node
Linux
https://npm.taobao.org/mirrors/node/latest-v10.x/node-v10.16.0-linux-x64.tar.xz
解压即可运行
windows
https://npm.taobao.org/mirrors/node/latest-v10.x/node-v10.16.0-x64.msi
10.16.x
开发环境
文档
- 搜索MDN,Mozilla Developer Network,提供非常完善HTML、CSS、JS等的技术资料。
- https://developer.mozilla.org/zh-CN/docs/Web/JavaScript
- 指南 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide 非常好的JS文档,使用任何一种文本编辑器,都可以开发JS.
Visual Studio Code
下面介绍一平台Visual Studio Code用于开发
下载 https://code.visualstudio.com/Download
支持windows、mac、Linux平台。
新版VS Code Windows版分为System 和 User两个版本,当前用户使用安装User版即可。
注释
和C,Java一样,// 单行注释,/*注释*/多行注释,也可以用在语句中
// var a = 10 // 单行注释
str = 'hello' + /*注释*/ 'world' // 语句中注释
/* // 多行注释
console.log(a)
b = 12
console.log(b)
*/
常量和变量
标识符
- 标识符必须是字母、下划线、 符 和 数 字 , 但 必 须 是 字 母 、 下 划 线 、 符和数字,但必须是字母、下划线、 符和数字,但必须是字母、下划线、符开头,依然是不能数字开头就行。标识符区分大小写。
声明
- var 声明一个变量
- let 声明一个块作用域的局部变量
- const 声明一个常量(必须声明时赋值,之后不能改)
- js 中的变量声明和初始化是可以分开的,即先声明变量,赋值(即初始化)可以在后面.
var a
let b
console.log(a,b)
a = 10 // 之后赋值
b = 20
console.log(a,b)
const c = 100
console.log(c)
c = 200 // 常量再次赋值时,出现异常
console.log(c)
----------------------------
undefined undefined // 有定义,当时没有初始化
10 20
100
Error:
f:\Markdown\workMD\node_440bf3524a7bf.tmp:15
c = 200
^
TypeError: Assignment to constant variable.
数据类型
序号 | 名称 | 说明 |
---|---|---|
1 | number | 数值型,包括整型和浮点型 |
2 | boolean | 布尔型,true和false |
3 | string | 字符串 |
4 | null | 只有一个值 |
5 | undefined | 变量声明未赋值的,对象未定义的属性 |
6 | symbol | ES6新引入的类型 |
7 | object类型 | 是以上基本类型的符合类型,是容器 |
ES是动态语言,弱类型语言。
虽然先声明了变量,但是变量可以重新赋值任何类型。
// 类型转换
// 弱类型
console.log('=====string=====')
console.log(a = 3 + 'magedu', typeof(a))
console.log(a = null + 'magedu', typeof(a))
console.log(a = undefined + 'magedu', typeof(a))
console.log(a = true + 'magedu', typeof(a))
----------------------------
=====string=====
3magedu string
nullmagedu string
undefinedmagedu string
truemagedu string
// 数字
console.log('=====number=====')
console.log(a = null + 8, typeof(a))
console.log(a = undefined + 8, typeof(a)) //undefined没法转换成一个对应的数字
console.log(a = true + 8, typeof(a))
console.log(a = false + 8, typeof(a))
----------------------------
=====number=====
8 'number'
NaN 'number'
9 'number'
8 'number'
// boolean
console.log('=====bool=====')
console.log(a = null + true, typeof(a))
console.log(a = null + false, typeof(a))
console.log(a = undefined + true, typeof(a)) //undefined没法转换成一个对应的数字
console.log(a = undefined + false, typeof(a)) // NaN
console.log(a = null & true, typeof(a))
console.log(a = undefined & true, typeof(a))
----------------------------
=====bool=====
1 'number'
0 'number'
NaN 'number'
NaN 'number'
0 'number'
0 'number'
// 短路
console.log(a = null && true, typeof(a)) // 逻辑运算符,null 直接就是false短路
console.log(a = false && null, typeof(a)) // 逻辑运算符,false短路返回false
console.log(a = false && 'magedu', typeof(a)) // boolean
console.log(a = true && 'magedu', typeof(a)) // 字符串
console.log(a = true && '', typeof(a)) // 字符串
console.log(a = '' && true, typeof(a)) // 字符串
----------------------------
null 'object'
false 'boolean'
false 'boolean'
magedu string
string
string
// null
console.log('=====null=====')
console.log(a = null + undefined, typeof(a))
----------------------------
=====null=====
NaN 'number'
弱类型,不需要强制类型转换,会隐式类型转换。
NaN,即Not a Number,转换数字失败。它和任何值都不等,和自己也不等,只能使用Number.isNaN(NaN)
总结:
- 遇到字符串,加号就是拼接字符串,所有非字符串隐式转换为字符串.
- 如果没有字符串,加号就把所有其它类型都当做数字处理,非数字类型隐式转换,undefined特殊,因为它没有定义值,所以转换数字失败得到一个特殊值NaN.
- 如果运算符是逻辑运算符,短路符,返回就是短路时的类型,没有隐式转换.
- 除非你十分明确,否则不要依赖隐式转换。写代码的时候,往往为了程序的健壮,请显式转换。
转义字符
名称 | 说明 |
---|---|
\0 | Null字节,空字节 |
\b | 退格符 |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | Tab(制表符) |
\v | 垂直制表符 |
\’ | 单引号 |
\" | 双引号 |
\ | 反斜杠符(\) |
\xxx | 由从0到377最多三位八进制数XXX表示的 Latin-1 字符。例如,\251是版权符号的八进制序列 |
\xXX | 由从00和FF的两位十六进制数字XX表示的Latin-1字符。例如,\xA9是版权符号的十六进制序列 |
\uXXX | 四位十六进制数字XXXX表示的Unicode字符。例如,\u00A9是版权符号的Unicode序列。见Unicode escape sequences (Unicode 转义字符) |
\u{XXXXX} | Unicode代码点 (code point) 转义字符。例如,\u{2F804} 相当于Unicode转义字符\uD87E\uDC04的简写 |
字符串操作方法
let shool = 'university'
console.log(shool.charAt(2)) // 获取字符串,相当于索引
console.log(shool[2]) //通过索引获取字符串
console.log(shool.toUpperCase()) //大写
console.log(shool.toLocaleLowerCase()) //转小写
console.log(shool.concat('.beijin')) //连接.拼接
console.log(shool.slice(3)) //切片
console.log(shool.slice(-3,-1)) // 切片,支持负索引
console.log(shool.slice(-3))
let url = ' www.baidu.com '
console.log(url.split('.')) //切割
console.log(url.substr(7,2)) //返回字符串从何处开始,取多长
console.log(url.substring(7,2)) //返回子串,从何处开始,到什么地方为止,类似于切片(起始位置是从小数开始,大数结束)
console.log(url.substring(2,7))
console.log(url.indexOf('du')) //9
console.log(url.indexOf('du',5)) //9
console.log(url.indexOf('XX',10)) //找不到返回-1
console.log(url.trim())
console.log(url.trimRight())
console.log(url.trimLeft())
数值型 number
在JS中,数据均为双精度浮点型范围只能在 -(2^53 -1) 和 2^53 -1之间,整型也不例外。
数字类型还有三种符号值:+Infinity(正无穷)、-Infinity(负无穷)和 NaN (not-a-number非数字)。
二进制0b0010、0B110。八进制0755。注意0855,将被认作十进制,因为8不在八进制中。ES6中最好使用0o前缀表示八进制。十六进制0xAA、0Xff。指数表示1E3(1000),2e-2(0.02)
方法 | 描述 |
---|---|
Number.parseFloat() | 把字符串参数解析成浮点数,和全局方法parseFloat()作用一直 |
Number.parselnt() | 把字符串解析成特定基数对应的整型数字,和全局方法parselnt()作用一致 |
Number.isFinite() | 判断传递的值是否为有限数字 |
Number.isInteger() | 判断传递的值是否为整数 |
Number.isNaN()判断传递的值是否为 NaN
- 内置数学对象Math Math提供了绝对值、对数指数运算、三角函数运算、最大值、最小值、随机数、开方等运算函数,提供了PI值
console.log(Math.PI)
console.log(Math.abs(-3))
console.log(Math.log2(8))
console.log(Math.random()*9+1) // 1~10直接的取值,random是无参数函数
运算符
算数运算符
- +, -,* ,/ ,% 运算符和python一样
console.log(Math.floor(3/2)) // 1
console.log(Math.ceil(3/2)) //2
console.log(Math.round(3/2)) //2
console.log(Math.round(1/2)) //1
++ 和 –
++ 和–单目运算符,代表变量自增、自减
i++先用i,用完之后i再自增加1,++i i先自增,再使用
比较运算符
- >、<、>= 、<= 没有什么区别
- != 、==
- !==、===
- == 宽松相等,进行类型转换,
- === 严格相等,不进行类型转换
console.log(100>'200') // false
console.log(100>10) // true
console.log('100'>10) // true 转换成数字后再比较
console.log('20'>'100') // true 按照字符串比较
// 宽松相等
console.log('100' == 100) // true
console.log('100' == '100') // true
//严格相等
console.log(100 === '100') //false
console.log(100 !== '100') //true
逻辑运算符
&&, ||, !与,或,非
这些运算符和其他高级语言都一样,支持短路
位运算
&, |, ^, ~ ,<< ,>>位与、位或、异或、取反、左移、右移,和Python一样
三元运算符
条件表达式 ? 真值 : 假值,等价于if…else结构
if(条件表达式){
真值
}
else{
假值
}
console.log(('5'>10) ?'真':'假') // 假
逗号操作符
js运行多个表达式写在一起
let a =2,b =true,c = a>10? 'true':'false'
console.log(c)
function test(){
return 3,a +b, c=a++
}
console.log(test()) // 结果是2,逗号操作符只取到最后
console.log(c)
-----------------------------------
false
2
2
其它
名称 | 说明 |
---|---|
instanceof | 判断是否是指定类型 |
typeof | 返回类型字符串 |
delete | delete操作符,删除一个对象(an object)或者一个对象的属性,(an,object’s property) 或者一个数组中某一个键值. |
in | 如果指定的属性在对象内,则返回true |
let x = '5'
y = new Number(x)
console.log(x instanceof Number) //false
console.log(x instanceof String) //false
console.log(new Number(x) instanceof Number) //true
console.log(new String(x) instanceof String) //true
console.log(y instanceof Number) //true
console.log(y instanceof String) //false
console.log(typeof('1')) //String
console.log(typeof(1)) //Number
console.log(typeof(y)) //object
- instanceof 要求必须明确使用类型定义变量,就是对象必须是new关键字声明创建的。它可以用于继承关系的判断。
- typeof就是返回对象的类型字符串。
delete 删除对象,属性,数组
x= 20
var y = 10
let z = 30
myobj = new Number()
myobj.h = 5
console.log(delete x)
console.log(delete y) //canot delete if declared with var
console.log(delete z) //canot delete if declared with let
console.log(delete Math.PI) //不能删除预定义属性
console.log(delete myobj.h) //自定义属性可以删除
console.log(delete myobj)
var trees = new Array("redwood","bay","cedar","oak","maple")
for (var i =0;i < trees.length;i++)
{
console.log(trees[i])
}
delete trees[3]; // 数组中元素被删除,但空着的位置是undefine
for (var i =0;i<trees.length;i++)
{
console.log(trees[i])
}
in
判断属性是否在对象内,(注意,不是指内容,in不判断内容)
var trees = new Array("redwood","bay","cedar","oak","maple")
console.log(0 in trees) //ture 0 在数组的index中
console.log("bay" in trees) // false bay不是数组对象的属性
console.log('length' in trees) // true length是数组对象的长度属性
let mycar = {color : 'red',carNumber :'888888'
};
console.log('color' in mycar)
运算符优先级
运算符由高到低
运算符 | 描述 |
---|---|
. [] () | 字段访问、数组下标、函数调用以及表达式分组 |
++, --, -, ~, !, delete new typeof void | 一元运算符、返回数据类型、对象创建、未定义值 |
* / % | 乘法、除法、取模 |
+ - + | 加法、减法、字符串连接 |
<<, >> | 移位 |
< , <= , > , >= , instanceof | 小于、小于等于、大于、大于等于、instanceof |
== != === !== | 宽松等、不等于、严格相等、非严格相等 |
& | 按位与 |
^ | 按位异或 |
| | 按位或 |
&& | 逻辑与 |
?: | 条件 |
= | 赋值、运算赋值 |
, | 多重求值,逗号表达式 |
逗号运算符优先级最低,比赋值语句还低
function * inc()
{
let i = 0
let j = 2
while (true){
yield i++
if (!j--) return 100
}
}
let x=inc()
for (let i=0;i<5;i++)
console.log(i,x.next())
--------------------------------
0 { value: 0, done: false }
1 { value: 1, done: false }
2 { value: 2, done: false }
3 { value: 100, done: true }
4 { value: undefined, done: true }
每次调用next() 方法返回一个对象,这个对象包含两个属性:value 和 done,value 属性表示本次 yield 表达式的返回值,done 属性为布尔类型。done是false表示后续还有yield语句执行,如果执行完成或者return后,done为true