JavaScript学习笔记--语法

代码风格:

  • 每句结尾不用加分号;
  • 单行注释用//,多行注释用/*...需要注释掉的代码....*/
  • 严格区分大小写
  • 优雅的代码需要注意锁进

基础知识:

  • Number:JavaScript不区分整数和浮点数,统一用Number表示。十六进制用0x前缀和0-9,a-f表示。

  • 字符串:以单引号'或双引号"括起来

     \n表示换行,\t表示制表符,字符\本身也要转义,所以\\表示的字符就是\。多行字符串用反引号 ` ... ` 表示。

> `这是一个
多哈
字符串`
< "这是一个
多哈
字符串"

如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK"包含的字符是I,',m,空格,O,K这6个字符。

如果字符串内部既包含'又包含"怎么办?可以用转义字符\来标识,比如:

> 'I\'m OK!'
< "I'm OK!"

ASCII字符可以以\x##表示十六进制

> '\x41'
< "A"

\u####表示一个Unicode字符

> '\u4e2d\u6587'
< "中文"

多个字符串连接起来,可以用'+变量+'号连接。或者用 反引号`....${变量}...`和 连接。

> var name = '小米'
> var age = 20
> var message = '你好,'+name+',你今年'+age+'岁了'
> console.log(message)
[Log] 你好,小米,你今年20岁了

----------------------------------------------

> var name = '小米'
> var age = 18
> var message = `你好,${name},你今年${age}岁了!`
> console.log(message)
[Log] 你好,小米,你今年18岁了!

----------------------------------------

或者直接  "你好,"+name+",你今年"+age+"岁了"

var message = '你好,'+name+',你今年'+age+'岁了'

都可以。

> message.length
< 14
> message[0]
< "你"
> message[13]
< "!"

// undefined 超出范围的索引不会报错,但一律返回undefined
> message[14]
< undefined

字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果

> message[14] = 'kkk'
< "kkk"
> console.log(message)
[Log] 你好,小米,你今年18岁了!

字符串是不可变的.下面这些方法本身不会改变原有字符串的内容,而是返回一个新字符串

toUpperCase()把一个字符串全部变为大写。

toLowerCase()把一个字符串全部变为小写。

indexOf()会搜索指定字符串出现的位置。

substring()返回指定索引区间的子串。

match() 方法 查找字符串中特定的字符,并且如果找到的话,则返回这个字符。没找到返回null。ex: var str="Hello world!" ; str.match("world")  返回world

replace() 方法在字符串中用某些字符替换另一些字符。ex:  var str="Visit Microsoft!"; str.replace("Microsoft","W3School")  返回Visit W3School!

> var test = 'Hello'
> test.toUpperCase()
< "HELLO"
> test.toLowerCase()
< "hello"

> var test1 = test.toUpperCase()
> console.log(test1)
[Log] HELLO

> console.log(test)
[Log] Hello

> var sTest = test+'hello'
> console.log(sTest)
[Log] Hellohello

> sTest.indexOf('llo')
< 2  //从索引2开始出现

> sTest.indexOf('HELLO')
< -1  // 没有找到指定的子串,返回-1

> sTest.substring(0,3)
< "Hel"  // 从索引0开始到3(不包括3)

> sTest.substring(3)
< "lohello" //从索引3开始到结束,包括3

  • 布尔值:truefalse

  • 比较运算符:

JavaScript允许对任意数据类型做比较。

false == 0; // true

false === 0; // false

要特别注意相等运算符==JavaScript在设计时,有两种比较运算符:

第一种是==比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;

第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。

由于JavaScript这个设计缺陷,不要使用==比较,始终坚持使用===比较。

NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示

Infinity; // Infinity表示无限大,当数值超过了JavaScriptNumber所能表示的最大值时,就表示为Infinity

另一个例外是NaN这个特殊的Number与所有其他值都不相等,包括它自己:

NaN === NaN; // false

唯一能判断NaN的方法是通过isNaN()函数:

isNaN(NaN); // true

最后要注意浮点数的相等比较:

1 / 3 === (1 - 2 / 3); // false

浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:

Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true

  • null和undefined

null表示“空”,它和0以及空字符串''不同,0是一个数值,''表示长度为0的字符串。

用null表示一个空的值,而undefined表示值未定义。大多数情况下,用null。undefined仅仅在判断函数参数是否传递的情况下有用。

  • 数组

两种创建方式。更多的用第二种

new Array(1, 2, 3); // 创建了数组[1, 2, 3]

var arr = [1, 2, 3.14, 'Hello', null, true]

arr[0]; // 返回索引为0的元素,即1

arr[5]; // 返回索引为5的元素,即true

arr[6]; // 索引超出了范围,返回undefined

要取得Array的长度,直接访问length属性。 arr.length; // 6

Array可以通过索引把对应的元素修改为新的值,因此,对Array的索引进行赋值会直接修改这个Array

var arr = ['A', 'B', 'C'];

arr[1] = 99;

arr; // arr现在变为['A', 99, 'C']

请注意,如果通过索引赋值时,索引超过了范围,同样会引起Array大小的变化:

var arr = [1, 2, 3];

arr[5] = 'x';

arr; // arr变为[1, 2, 3, undefined, undefined, 'x']

arr.indexOf('A'); // 元素A的索引为0

arr.indexOf(30); // 元素30没有找到,返回-1

Array也可以通过indexOf()来搜索一个指定的元素的位置

slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array。 slice()的起止参数包括开始索引,不包括结束索引。如果不给slice()传递任何参数,它就会从头到尾截取所有元素。利用这一点,我们可以很容易地复制一个Array。

push()Array的末尾添加若干元素,pop()则把Array的最后一个元素删除掉。

Array的头部添加若干元素,使用unshift()方法,shift()方法则把Array的第一个元素删掉。

sort()可以对当前Array进行排序,它会直接修改当前Array的元素位置,直接调用时,按照默认顺序排序。

reverse()把整个Array的元素给反转。

splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素。单词英语意思:粘接

concat()方法把当前的Array和另一个Array连接起来,并返回一个新的Array。concat()方法可以接收任意个元素和Array,并且自动把Array拆开,然后全部添加到新的Array里。

join()方法是一个非常实用的方法,它把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串。

多维数组:数组的某个元素又是一个Array,则可以形成多维数组。

> var arr = ["B", "C", "D", "E", "F", "G"] ;
arr.sort();   //排序
arr;
< ["B", "C", "D", "E", "F", "G"]

> arr.reverse()   //反转
< ["G", "F", "E", "D", "C", "B"]

> arr.splice(2,3,'s',2) //既删除又添加
> arr
< ["G", "F", "s", 2, "B"]

> arr.splice(2,2)   //只删除,不添加
> arr
< ["G", "F", "B"]

> arr.splice(2,0,'a','b')   //只添加,不删除
> arr
< ["G", "F", "a", "b", "B"] (5)

> var arr = ['A', 'B', 'C'];
var added = arr.concat([1, 2, 3]);  //Arr和另一个Array连接,自动把Array拆开,然后全部添加到新的Array里。
arr;
< ["A", "B", "C"] 
> added
< ["A", "B", "C", 1, 2, 3]

> added
< ["A", "B", "C", 1, 2, 3]

> added.join('-')  //将数组元素连接返回字符串,如果Array的元素不是字符串,将自动转换为字符串后再连接。
< "A-B-C-1-2-3"

> added[8] = null
> added.join('-')
< "A-B-C-1-2-3---"

>added[6] = '\x41'

> added.join('-')

< "A-B-C-1-2-3-A--"

  • 对象

JavaScript的对象是一组由键-值组成的无序集合。

要获取一个对象的属性,我们用对象变量.属性名 或者 对象变量['属性名']的方式。

delete 属性

in 属性

toString 属性。toString定义在object对象中,而所有对象最终都会在原型链上指向object,所以xiaoming也拥有toString属性

判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法

> var xiaohong = {
name: '小红',
'middle-school': 'No.1 Middle School'
};

> xiaohong['middle-school'];//对象变量['属性名']
< "No.1 Middle School"

> xiaohong['name']; //对象变量['属性名']

< "小红"

xiaohong.name; //对象变量.属性名
< "小红"

> delete xiaohong.name  //delete 属性--删除
> xiaohong
< {middle-school: "No.1 Middle School"}

> 'name' in xiaohong  //in 属性,返回true或者false
< false

> 'middle-school' in xiaohong
< true

> 'toString' in xiaohong  //toString 属性,true
< true

> xiaohong.hasOwnProperty('middle-school')
< true

> xiaohong.hasOwnProperty('toString')
< false

  • 变量

变量名是大小写英文、数字、$_的组合,且不能用数字开头。变量名也不能是JavaScript的关键字,如ifwhile等。申明一个变量用var语句。使用等号=对变量进行赋值

  • strict模式(精确模式)

申明一个变量必须用var语句。在strict模式下运行的JavaScript代码,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误。

启用strict模式的方法是在JavaScript代码的第一行写上:

'use strict'

上一篇:无限循环和用户输入作为终止


下一篇:扩展欧几里得算法:吃蛋糕