本系列教程的说明

  本教程说白了可以说是我自己学习JavaScript的笔记,主要内容参考自《JavaScript权威指南》,部分内容可能来自互联网,本系列教程假设学者之前学过c或者其它的编程语言,所以一些基本for、if等语句的用法并不讲解。

javascript简介

  JavaScript简称js,最初由网景(现在的Mozilla)公司创建,由于商标冲突原因,其标准版本命名为ECMAScript,但是一般人们还是叫JavaScript,只在谈标准的时候说到ECMAScript这个名字。值得注意的是JavaScript与java没有任何关系,就像雷峰塔(神话中镇压白娘子的塔)和雷锋。此外js(JavaScript)和jsp(java servlet pages)也没有关系。

  js的工作分为两部分,一部分属于js语言本身的特性,而另一部需要依靠宿主环境(web浏览器)才能完成。

js的词法

字符书写

  字符集方面,要求JavaScript的程序必须是用Unicode字符集编写的。代码编写是区分大小写的,值得注意的是html是不区分大小写的(xhtml区分),而这个问题在css中则稍显复杂,由于要和html结合,所以css只有在选择器选择id和class时区分大小写,其他情况都不区分大小写。

  Unicode转义序列,由于我们生活中经常用到ASCII之外的字符,比如中文字符等,为了避免不必要的麻烦,JavaScript支持采用Unicode转义的方式来编码字符串。比如在js中 'café' === 'caf\u00e9' 的结果是true。

  在标识符定义方面,js支持使用下划线、美元符号(在jQuery中常用)、字母和数字来书写,并且数字不能开头。虽然js强大到支持使用非英语语言来书写标识符,比如 var π=3.14 ,但是从移植性考虑,并不推荐。

  此外和其它语言一样,标识符绝对不能和关键字同名,js中的关键字除了包括所有java的关键字外,还包括function、typeof、var、in、debugger这些,还有arguments、eval虽然不是关键字,但是还是在严格模式下被限制而不能作为标识符。

可选的分号

  在js中各语句之间可以用分号作为分隔符,类似于c语言一样,不过js中的分号是可选的,也就是有时候可以写可以不写。看下面的代码

var a
a
=
3
console.log(a)

js会把上面的代码解析为下面的语句执行

var a; a=3; console.log(a);

这就是js的自动添加分号的功能,如果js发现缺少分号无法正确解析代码,它就会尝试添加分号并执行,值得注意的是自动添加的分号只添加在行尾,也就是说下面的代码虽然缺少分号(3和b之间),但是js也不会自动添加,而是报错:

a=3 b=4;

虽然js拥有这么强大的功能,但是我们并不推荐这样写代码,反而有时候要防止别人这样写代码带来的麻烦,看下面的例子:

var y=x+f
(a+b).toString()

看起来好像应该是两条独立的语句,事实上js会把 f(a+b) 连起来当成一个函数执行,所以上面两行只写了一条语句。因此为了防止这种错误的发生经常出现如下的代码:

...
;[x,x+1,x+2].forEach(console.log);
...

这种以(、[、/、+、-等开头的行容易引起上面的问题,故一般这种行开始的代码会手动在行首加一个分号表示这是一个新的语句。此外在行合并时有个例外,就是return、break、continue这三个关键字组成的语句中不能有换行,看下面的代码:

return
true;

上面的代码会解析为 return; true; 因为return、break、continue这三个关键字组成的语句不能有换行。最后一个问题就是前缀和后缀的自增自减运算符,如果为后缀运算符,则它必须和变量在同一行,看下面的代码:

x
++
y

会被解析为 x; ++y 而不是 x++; y 。

js的数据类型

  虽然js属于弱类型语言,但其总共有6种数据类型。弱类型的意思是定义的变量没有类型的区分,比如先执行 var num=123; 定义了一变量num存储整数,可接下来执行 num="hello world"; 将字符串赋值给num变量并不会报错,是合法的。

  js的弱类型相对于强类型的语言来说看起来好像很好用,其实也不尽然,下面列举了一些字符串和整数进行操作时候的一些因为js的弱类型带来的问题。

32 + 32 // 结果是 64
"32" + 32 // 结果是 "3232"
"32" - 32 // 结果是 0 /*
值得一提的是基于上面的一些问题,这里出现了两个类型转换技巧
字符串转整数:num - 0;
整数转字符串:num + '';
*/

js中的六种数据类型

  原始类型:①number;②string;③boolean;④null;⑤undefined

  对象类型:⑥object(Function,Array,Date等都是object类型)

js中的数组与对象

  数组和对象是js中特别重要的用于存储数据的一种类型,其中数组和对象分别用 [] 和 {} 表示没有任何 元素/属性 的 数组/对象 , 并且这两个东西都有一个特性就是动态添加。比如 var arr=[] 先定义了一个空的数组,之后使用 arr[0]='hello'; 语句可以向数组arr中添加元素。对于对象 var stu={} 先定义了一个没有属性的对象,之后可以使用 stu['name']='张三'; 添加name属性。而c语言和java语言中就会出错,在java中会报空指针异常。

  关于数组和对象的具体用法我们将在后面的章节中详细介绍,这里只做简要说明。

js的隐式转换

  因为js是弱类型,所以存在大量的隐式转换,其中下面的结果都是true

"1.23" == 1.23 //尝试将字符串转换为数字再比较
0 == false //将boolean值转换为数字再比较,其中false转为0,true转为1,
      //所以1==true返回true,但是2==true返回false
null == undefined
//如果是object==string|number会尝试将对象转换为基本类型 比如:new String('hi') == 'hi' 会
//返回true,其它情况会返回false。

  这样一来就有人会问,那怎么保证 1.23 等于1.23 而不等于 "1.23" 呢?这个就引出了js中的一个新的运算符 === 严格等于运算符,这个运算符会先判断等号两边的类型是否相同,不同就直接返回false。如果类型相同且满足一下原则会返回true:

  ①数值满足值相等

  ②字符串满足长度和字符均相等

  ③null === null

  ④undefined === undefined

  此外还有两个东西NaN和object,其中NaN和任何东西比较都是false,包括它自己,即NaN===NaN也返回false,而object是引用比较,只有是同一个对象才返回true。

js包装类型

  如上图所示,虽然前面讲过string(不是String)属于基本类型,但是其依然有属性length,这看起来似乎有对象的影子,这其实是js的包装起的作用,每次在使用string、number等类型的变量时,js会自动对这些变量进行包装,创建出一个临时对象出来,图上所示在执行str.length时js偷偷执行new String(str).length了。

js类型检测

1、使用typeof检测类型

typeof 100    //返回 "number"
typeof true //返回 "boolean"
typeof function //返回 "function"
typeof (undefined) //返回 "undefined"
typeof new Object() //返回 "object"
typeof [1,2] //返回 "object"
typeof NaN //返回 "number"
typeof null //返回 "object"

2、使用instanceof判断对象类型(格式:对象 instanceof 函数构造器)

[1,2] instanceof Array //返回true
new Object() instanceof Array //返回false

3、使用Object.prototype.toString

Object.prototype.toString.apply([]);    //返回 "[object Array]"
Object.prototype.toString.apply(function(){}); //返回 "[object Function]"
Object.prototype.toString.apply(null); //返回 "[object Null]"
Object.prototype.toString.apply(undefined); //返回 "[object Undefined]"

JavaScript基础入门教程(一)的更多相关文章

  1. JavaScript基础入门教程(四)

    说明 前面三篇博客介绍了js中基本的知识点,包括变量类型及其转换.表达式.运算符等小知识点,这篇博客主要讲的是对象.如果你学过java等语言,你也许在下文的阅读中发现在js中的对象与java中的对象存 ...

  2. JavaScript基础入门教程(二)

    说明 前一篇博客介绍了js以及一些关于js基本类型的简单知识,本篇博客将详细介绍js的基础类型,捎带介绍对象类型,更详细的对象类型的说明将后续再讲. js中类型的说明 js中的类型分为基本类型和对象类 ...

  3. JavaScript基础入门教程(六)

    说明 在看这篇博文之前还是希望读者阅读本系列前几篇文章,还有就是该系列需要读者拥有其它语言的编程基础,一些基本的知识点,比如什么是形参和实参将不再赘述.这篇博文主要讲函数. 函数的定义 在js种支持函 ...

  4. JavaScript基础入门教程(五)

    说明 本系列博客的第一篇已经说明了,要求阅读者需要具有其它语言的编程基础,所以关于组数的基础部分本篇博客将不再赘述,主要讲js中数组的特性. 创建数组 数组的创建主要有两种方法,一种是数组直接量,还有 ...

  5. JavaScript基础入门教程(三)

    说明 前面的两篇博客介绍了js中的基本知识中的变量类型.标识符等.这篇博客主要谈表达式以及运算符. 原始表达式 原始表达式就是表达式中最小的,不能在分割的表达式,一般指变量.常数直接量.关键字(tru ...

  6. ECMAScript 6.0基础入门教程

    ECMAScript 6.0基础入门教程 转:https://blog.csdn.net/hexinyu_1022/article/details/80778727 https://blog.csdn ...

  7. [置顶] IOS 基础入门教程

    IOS 基础入门教程 教程列表: IOS 简介 IOS环境搭建 Objective C 基础知识 创建第一款iPhone应用程序 IOS操作(action)和输出口(Outlet) iOS - 委托( ...

  8. Python基础入门教程

    Python基础入门教程 Python基础教程 Python 简介 Python环境搭建 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循 ...

  9. React Native基础&入门教程:初步使用Flexbox布局

    在上篇中,笔者分享了部分安装并调试React Native应用过程里的一点经验,如果还没有看过的同学请点击<React Native基础&入门教程:调试React Native应用的一小 ...

随机推荐

  1. win10安装提示“我们无法创建新的分区”

    今日于笔记本安装win10时突然出现提示:我们无法创建新的分区.网上搜了不少建议,尝试了都无果. 由于我的笔记本是固态硬盘与机械硬盘混合,所以情况可能更加特殊. 最后成功的方法是: 1. 先将Win1 ...

  2. .net连接sql server的几种连接字符串的写法

    .net连接sql server的几种连接字符串的写法 1, 混合验证模式登录 server=电脑名 或 电脑IP;database=数据库名;uid=数据库登录名;password=数据库登录密码 ...

  3. ORACLE导入Excel数据

    首先建好一个和Excel表字段对应字段的表,然后 select t.* from 表名 t  for update; 点击这个锁子,打开它 粘贴,然后 再提交事务即可

  4. JS实现全选与取消 Jquery判断checkbox是否被选中

    1.JS实现checkbox全选与取消 <body> <input type="checkbox" name="select_all"/> ...

  5. linux命令(21):more命令

    实例1:显示文件中从第3行起的内容 [root@host-172-168-80-55 home]# cat test.log aaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbb ...

  6. Django-form組件補充

    自定义验证规则 方法一: 1 2 3 4 5 6 7 8 9 10 from django.forms import Form   from django.forms import widgets f ...

  7. QT中循环显示图片和简单的显示图片

    请关注我的github https://github.com/linqiaozhou 以下实例代码不久后将会上传到我的github 这是我最近一个项目中的部分代码 //以下是简单的在QT中显示图片的代 ...

  8. AC日记——[POI2008]BLO-Blockade 洛谷 [POI2008]BLO-Blockade

    [POI2008]BLO-Blockade 思路: tarjan: 代码: #include <bits/stdc++.h> using namespace std; #define ma ...

  9. lr_Vugen界面图

  10. canvas时钟效果

    话不多说,直接上代码 <!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/x ...