JavaScript编程基础

一、


1 .JavaScript基础语法

注释:

1.单行注释:

//单行注释

多行注释:

/*

 *较长的多行

 *注释

 *

 */

最好是针对某个功能来写注释

2. 语句

JavaScript中,语句一般以分号结尾,每条语句独占一行来写代码;不写分号也不会报错,但是代码压缩时可能会有问题,建议加上分号。

let i = 10;

console.log(i);//10

 

可以使用C语言风格一对大括号将多条语句组合到一个代码块里。

{

let i = 10;

console.log(i);//10

}

3. 标识符

所谓标识符,就是指用来标识某个实体的一个符号。再说通俗一点,就是自己起一个名字,这个名字可以用来作为变量名,函数名,对象名等。在JavaScript中,虽然说标识符是自己取名字,但是也是需要遵守一定的规则, 其命名的规则大致可以分为2大类:硬性要求和软性要求。

硬性要求:

1.可以是由数字,字母,下划线和美元符号组成,不允许包含其他特殊符号

2.不能以数字开头

3.禁止使用JavaScript中的关键词和保留字来进行命名。

4.严格区分大小写

软性要求:

望文知意。

命名的三种方法

1.匈牙利命名法

是微软公司下面以为匈牙利籍的程序员所发明的命名法则,其特点是标识符的名字以一个或者多个小写字母开头,表示该变量的数据类型;

| 数据类型               |  对应前缀   |

| --------                   -------        

|  Array数组             |   a         |

|  Boolean布尔           |   b         |

|  Float浮点             |   f         |

|  Function              |   fn        |

|  Intergerint)整型   |   i         |

|  Object对象            |   o         |

|  Regular Expression正则|   re        |

|  String  字符串        |   s         |

前缀之后的是一个单词或多个单词的组合,该单词表明表明变量的用途。

例如:a_arrayo_object,i_userAge ,b_isPassed.

2.驼峰命名法:

大驼峰:就是每一个单词都是首字母大写。例如:UserName

小驼峰:第一个单词的首字母是小写,后面单词的首字母是大写。例如:userName

3.蛇形命名法:

特点在于单词与单词之间使用下划线进行分隔。

这种命名法常见于Linx内核,c++标准库,Boost以及RubyRust等语言。

例如:user_name,my_name.

4.关键字和保留字

首先需要弄清楚关键字和保留字的区别是什么。

      ECMA-262描述了一组具有特定用途的关键字。这些关键字可用于表示控制语句的开始或结束,或者用于执行特定操作等。按照规则,关键字是语言本身所保留的,不能用作标识符。

      ECMA-262还描述了另外一组不能用作标识符的保留字。尽管保留字在这门]语言中还没有任何特定的用途。但它们有可能在将来被用作关键字。

JavaScript中的关键字与保留字如下:

      abstractawaitbooleanbreakbytecasecatchcharclassconstcontinuedebuggerdefaultdeletedodoubleelseenumexport

extendsfalsefinalfinallyfloatforfunctiongotoifimplementsimportininstanceofint

interfaceletlongnativenewnullpackageprivateprotectedpublicreturnshortstaticsuper

switchsynchronizedthisthrowthrowstransienttruetrytypeofvarvolatilevoidwhilewithyield

5. 数据类型介绍

JavaScript中,数据类型整体上来讲可以分为两大类:简单数据类型和复杂数据类型

简单数据类型:

简单数据类型一共有6:

string, symbol, number, boolean, undefined, null其中symbol类型是在ES6里面新添加的基本数据类型

复杂数据类型:

复杂数据类型就只有1object

包括JavaScript中的数组,正则等,其类型都是object类型

查看数据类型:

JavaScript中,我们可以通过typeof运算符来查看一个数据的数据类型

console. log( typeof 10);//number

console. log(typeof true);//boolean

console. log(typeof 'Hello');//string

console. log(typeof [1,2,3]);//object

二、变量

所谓变量,就是用于引用内存中存储的一一个值。当然, 我们在使用变量之前,还需要先做的一件事儿就是声明变量。

1.声明变量

      JavaScript中声明变量的方式有3: var let const 。其中var现在已经不推荐使用了,因为会有变量提升等问题。(后面我们会具体来探讨此问题)

      constlet的区别在于,const 所声明的变量如果是简单数据类型,那么是不能够再改变的。而let所声明的变量无论是简单数据类型还是复杂数据类型,在后面是可以改变的。示例如下:

const声明变量

const name = 'Bill';

name = 'Lucy';

//TypeError: Assignment to constant variable.  

let声明变量

let name = 'Bill';

name = 'Lucy';

console.log(name);

2. 变量的赋值与初始化

利用=给变量进行赋值,第一次赋值叫做初始化。在声明变量时就会将变量给初始化,如下:

let a = 3

也可以一次性初始化多个变量,将其写在一行里面。

let x = 3,y = 4,z = 5;

如果声明变量时没有赋予初值,那么默认值为undefined

let a;

console.log(a);//undefined

3. 使用var声明变量

      前面有提到过,在JavaScript中声明变量的方式有3: var, let ,  const。其中var现在已经不推荐使用了。这是因为使用var来声明变量会伴随着一些问题。 当然,这些问题也经常被看作是JavaScript的一些特点,例如重复声明和遗漏声明。

      重复声明

      如果是使用var关键字来声明的变量,那么是允许重复声明的。只不过这个时候会忽略此次声明。如果重新声明并且带有赋值,则相当于是重新赋值

      重复声明不带有賦值操作,JS引擎会自动忽略后面的变量声明

      var test = 3;var test;

   var test;

      console. log(test);//3

      重新声明时如果带有赋值操作,那么会进行一一个数据的覆盖

      var test = 3;var test = 5;

   var test = 5;

      console. log(test);//5

需要注释重复声明仅仅是使用var关键字时可以这样,如果是在严格模式中,或者使用letconst的话是会报错的。

遗漏声明

如果试图读取一个没有声明的变量的值,JS会报错

console.log(a);

//ReferenceError: a is not defined

JS允许遗漏声明,即直接对变量赋值而无需事先声明,赋值操作会自动声明该变量。

{

a = 5;

console.log(a);//5

}

console.log(a);//5

4. 作用域

1.全局作用域

这是JS引擎-进来就处于的运行环境。在全局作用域的中所声明变量称之为全局变量。全局变量的特点在于变量在任何地方都能被访问。

let a = 5;//这是一个全局变量

2.局部作用域

JavaScript中,一对大括号就可以产生一个局部作用域。局部作用域里面的变量称之为局部变量,既然是局部变量,那么就只能在这个局部的作用域里面能访问到,外部是访问不到的。

{

leti=10;

console. log(i) ;//10

console.log(i);

//ReferenceError: i is not defined

顺带一提的是,在大括号中用var声明的变量不是局部变量,而是一个全局变量。这其实也是最早使用var来声明变量所遗留下来的一一个问题。

{

var i = 10;

console.log(i);//10

}

console.log(i);//10

在局部作用域里面,如果变量名和全局作用域里面的变量名冲突,优先使用局部作用域里面的变量。

let i = 10;

{

let i = 100;

console.log(i);//100

}

console.log(i);//10

 

如果在局部作用域里面声明变量时没有书写关键字,那么会申明一个全局变量

 

{

i = 10;

}

console.log(i);//10

 

 

三、数据类型

 

数据类型介绍

 

JavaScript中,数据类型整体上来讲可以分为两大类:简单数据类型和复杂数据类型

简单数据类型

简单数据类型一共有6:

string, symbol, number, boolean, undefined, null其中symbol类型是在ES6里面新添加的基本数据类型

 

1.Undefined类型

只有一个值,即undefined值。使用var声明了变量,但未给变量初始化值,那么这个变量的值就是undefined

2.Null类型

null类型被看做空对象指针,前文说到null类型也是空的对象引用。

3.Boolean类型

该类型只有两个值,truefalse

4.Number类型

Number类型包含整数和浮点数(浮点数数值必须包含一个小数点,且小数点后面至少有一位数字)两种值。

NaN:非数字类型。特点:1.涉及到的 任何关于NaN的操作,都会返回NaN  2. NaN不等于自身。

isNaN() 函数用于检查其参数是否是非数字值。

isNaN(123)  //false   isNaN("hello")  //true

5.String类型

字符串有length属性。

字符串转换:转型函数String(),适用于任何数据类型(null,undefined 转换后为nullundefined);toString()方法(null,defined没有toString()方法)。

6 symbo类型

ES5中包含5种原始类型:字符串、数字、布尔值、null和undefined。ES6引入了第6种原始类 :symbol

ES5的对象属性名都是字符串,很容易造成属性名冲突。比如,使用了 一个他人提供的对象,想 为这个对象添加新的方法,新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证 每个属性的名字都是独一无二的,这样就从根本上防止了属性名冲突。这就是ES6引入symbol 原因。

 

复杂数据类型

复杂数据类型就只有一种object

包括JavaScript中的数组,正则等,其类型都是object类型

查看数据类型

JavaScript中,我们可以通过typeof运算符来查看一个数据的数据类型

console. log( typeof 10);//number

console. log(typeof true);//booleanconsole. log(typeof 'Hello');//stringconsole. log(typeof [1,2,3]);//object

字符串类型

字符串介绍

这是程序里面使用最为广泛的一-种类型。在JavaScript里面, 可以使用单引号,也可以使用双引号;

字符串这种数据类型非常霸道,它和其他数据类型相加都会被转换后才为字符串类型;
所以如果我们要让一个非字符串的变量转换为字符串的话,只需要和一个空字符串相加就可以了。
当然,转换字符串事实上我们也有相应的函数来转换,最常见的就是toString()函数。

nullundefined并不能通过toString0函数来转换为相应的字符串 。还有一个知识点,就是toString(函数在转换数值的时候是 可以带有参数的。可以将数值指定转换为几进制

JavaScript还有一个函数是string(),这个函数可以将五种类型都转换为字符串

字符串模板

es6中新增了模板字面量是增强版的字符串,它用反引号(`)标识

使用模板字面量语法创建一个字符串,并赋值给message变量,这是变量的值与一个普通字符串无异;

如果想在字符串中包含反引号,只需要使用反斜杠\转义即可;

在反引号之内的所有空白符都是字符串的一部分,因此需要特别留意缩进

模板字面量看上去仅仅是普通JS字符串的升级版,但二者之间真正的区别在于模板字面量的变量占位符。变量占位符允许将任何有效的JS表达式嵌入到模板字面量中,并将其结果输出为字符串的一部分

变量占位符由起始的${与结束的}来界定,之间允许放入任意的JS表达式。最简单的变量占位符允许将本地变量直接嵌入到结果字符串中
   占位符${name}会访问本地变量name,并将其值插入到message字符串中。message变量会立即保留该占位符的结果
既然占位符是JS表达式,那么可替换的就不仅仅是简单的变量名。可以轻易嵌入运算符、函数调用等

symbol类型

ES5中包含5种原始类型:字符串、数字、布尔值、nullundefinedES6引入了第6种原始类型:symbol

 

ES5的对象属性名都是字符串,很容易造成属性名冲突。比如,使用了一个他人提供的对象,想为这个对象添加新的方法,新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的,这样就从根本_上防止了属性名冲突。这就是ES6引入symbol的原因。

简单值和复杂值的区别
简单值

简单值是表示JS中可用的数据或信息的最底层形式或最简单形式。简单类型的值被称为简单值,是因为它们是不可细化的。

也就是说,数字是数字,字符是字符,布尔值是truefalse, nullundefined就是null

undefined。这些值本身很简单,不能够再进行拆分。由于简单值的数据大小是固定的,所以简单值的数据是存储于内存中的栈区里面的。

nllundefined比较特殊,打印出来的数据类型分别是objectundefined。因为这两个数据类型没有对应的构造函数

复杂值

JavaScript,对象就是一个复 杂值。因为对象可以向下拆分,拆分成多个简单值或者复杂值。复杂值在内存中的大小是未知的,因为复杂值可以包含任何值,而不是一个特定的已知值。所以复杂值的数据都是存储于堆区里面。

访问方式

按值访问:简单值是作为不可细化的值进行存储和使用,引用他们会转移其值

引用访问:复杂值是通过引用进行存储和操作的,而不是实际的值。创建一个包含复杂对象的变量时,其值是内存中的一个引用地址。引用一个复杂对象时,使用它的名称(即变量或对象属性)通过内存中的引用地址获取该对象值

比较方式:简单值采用值比较,而复杂值采用引用比较。复杂值只有在引用相同的对象(即有相同的地址)时才相等。即使是包含相同对象的两个变量也彼此不相等,因为它们并不指向同一个对象

动态属性

对于复杂值,可以为其添加属性和方法,也可以改变和删除其属性和方法;但简单值不可以添加属性和方法

复杂值支持动态对象属性,因为我们可以定义对象,然后创建引用,再更新对象,并且所有指向该对象的变量都会获得更新。

一个新变量指向现有的复杂对象,并没有复制该对象。这就是复杂值有时被称为引用值的原因。复杂值可以根据需求有任意多个引用,即使对象改变,它们也总是指向同一个对象

变量赋值

最后说一下关于变量的赋值,其实是可以分为直接赋值和引用赋值的。直接赋值,就是指将简单值赋值给变量,而引用赋值是指将一个复杂值的引用赋值给变量,这个引用指向堆区实际存在的数据

类型转换

隐性转换
当不同数据类型进行相互运算的时候,当对非布尔类型的数据求布尔值的时候
预期为数字的时候:
算术运算的时候,我们的结果和运算的数都是数字,数据会转换为数字进行计算(-* / %)

预期为字符串的时候:

转为字符串使用+号时候,会自动转换为字符串

预期为布尔的时候:

转换为布尔值,undefined, null,  11”0, NaN转为false, 其余转为true

强制转换

转换为数值number()parseInt() parseFloat() 转换函数小技巧:

转换字符串: a="+数据转换布尔: !数据类型

转换数值:数据类型*/1

运算符

任何编程语言基本上都离不开运算符。在JavaScript中也是支持众多运算符的。例如最常见的算数运算符,比较运算符,逻辑运算符等。接下来,就让我们一起来看一下JavaScript中这几种常见的运算符。

 

算数运算符,

 

常见的算数运算符有加减乘除和取模运算。主要需要注意的就是,在动态语言中做除法运算时,能够得到小数。

es6开始新增加了求幂运算,使用两个*号代表求幂。

一元运算符

所谓一元运算符,就是指只作用于一一个操作数的运算符。常见的一元运算符有两种,赋值运算符和递增递减运算符。

常见的一元运算符还有递增和递减。在递增递减中,主要需要注意前置和后置的区别。如果是前置,那么是先自增或自减,然后参与运算。如果是后置,则是先参与运算,然后再自增或者自减,

需要注意的是,我们的自增自减操作符不仅仅局限于数值,其他类型也可以,遵循下面的规则: :

在应用于一个包含有效数字字符的字符串时,现将其转换为数字值,再执行加减1操作。字符串变量变为了数值变量。

在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN,字符串变量变成数值变量。

遇布尔值false时, 先将其转换为0再执行加减1操作,布尔值变量变成数值变量。

遇布尔值true时,先将其转换为1再执行加减1操作,布尔值变量变成数值变量。

在应用浮点数数值时,执行加减1操作。

比较运算符

如果两个数都是数值,则执行数值比较

如果两个数都是字符串,则比较两个字符串对应的字符编码

如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值的比较

如果一个操作数是对象,则调用这个对象的valueOf()方法,用得到的结果按照前面的规则执行比较。如果对象没有value0f()方法,则调用toString()方法,并用得到的结果根据前面的规则执行比较。

如果一个数是布尔值,则先将其转换为数值,然后再进行比较

 

相等和不相等
==表示相等,!= 表示不相等,数据类型不同的数据进行相等比较的话会自动转换数据类型,还有一些其他的转换规则如下:
●nullundefined是相等的
如果有一个操作数是NaN,则返回false, NaNNaN比较也是false

如果是数字的字符串和数字进行比较,会先将字符串转换为数字

布尔值里面true转换为1false转换 0

全等是===,不全等是!==这个就是必须数据类型和数值都相等

逻辑运算符

所谓非,就是取反,非真即假,非假即真

非运算符不仅仅只能用于布尔值,其他数据类型也是可以的,如下:

如果操作数是一个对象,返回false

如果操作数是一个空字符串,返回true●如果操作数是一个非空字符串,返回false如果操作数是数值0,返回true

如果操作数是任意非0数值(包括Infinity), 返回false●如果操作数是null,返回true●如果操作数是NaN,返回true

如果操作数是undefined,返回true

作用于两到多个值,并且只有所有的操作数都是真值时,才为true
JavaScript里面的与存在短路现象,具体说明如下:
●第一个操作数为真:会进入第二个操作数的判断,且无论第二个操作数真假,都会返回第二个操作数。
●第一个操作数为假:不会进入第二个操作数的判断,直接返回第一 个操作数。

如果你看《JavaScript高级程序设计》这本书,里面还讲了诸如下面这些杂七杂八的规则:

●如果第一个操作数是对象,则返回第二个操作数

●如果第二个操作数是对象,则只有在第一-个操作数的求值结果为true的情况下才会返回该对象

●如果两个操作数都是对象,则返回第二个操作数

●如果有一个操作数是null,则返回null

●如果有一个操作数是NaN,则返回NaN

●如果有一个操作数是undefined, 则返回undefined

同样是作用于两到多个值,但是只有一个操作数为真,就返回真
JavaScript里面的或同样存在短路现象,具体说明如下:
●如果第一个操作数为真,则不会进入第二个数的判断。所以无论第二个操作数真假,都直接返回第-个操作数
●如果第一个操作数为假,则会进入第二个数的判断。但是无论第二个操作数真假,都直接返回第二个操作数

如果你看《JavaScript高级程序设计》这本书,里面也讲了诸如下面这些杂七杂八的规则:

●如果第一个操作数是对象,则返回第一 个操作数

●如果第一个操作数的求值结果为false, 则返回第二个操作数

●如果两个操作数都是对象,则返回第一个操作数

●如果两个数都是null,则返回null

●如果两个数都是NaN,则返回NaN

●如果两个数都是undefined,则返回undefined

猜你喜欢

转载自www.cnblogs.com/zai1/p/11110919.html
今日推荐