目录

一、JavaScript的实现

JavaScript = ECMAScript+BOM+DOM

ECMAScript:ECMA(欧洲计算机制造协会)指定的全新脚本语言,用于规定当时三足鼎立的三家Script语言(网景的JavaScript、Nombas的ScriptEase和微软的JScript),描述了该语言的语法和基本对象。

在此基础上,JavaScript还拥有自己的组成部分:

BOM(Browser Object Model):浏览器对象模型,描述了与浏览器进行交互的方法与接口。

DOM(Document Object Model):文档对象模型,描述了处理网页内容的方法和接口。

二、JavaScript语言的特点

JS是一门弱类型客户端脚本语言,无需编译,直接解释执行

每个浏览器都有JS的解析引擎,客户提交的数据可以在客户端就进行校验。

拥有:交互性、安全性和跨平台性。

三、JS与HTML如何结合

也就是如何在HTML文件中书写JS代码呢?在哪里写呢?

  • 可以在内部任何的地方定义<script></script>标签,在标签的内部书写JS代码,需要注意的是:解析顺序是逐行进行的,JS代码定义的位置将会影响执行的顺序。
  • 可以引入外部文件,如<script src="xxx"></script>,src的值即为外部链接。

JS解析器将会自动地给没加分号的语句添加分号,但是建议加上分号。

将script标签写成自闭和或者js代码出现错误,可能会导致全部的JS代码无法正常执行。

四、JS中的数据类型

四、JS的原始数据类型

原始数据类型(primitive type)也就是基本数据类型,在ES6之前,主要有以下五种:

  • Number:代表数字(不区分整型和浮点型,底层实现都是浮点型)。

  • String:表示字符串类型,用引号包裹起来,单双引号都可。

  • Boolean:包含true或者false两个值。

  • Null:只包含一个null值 ,一个不存在的值,常作为返回值使用。

  • Undefined:变量未初始化时,默认值为undefined。

关于大小写,众说纷纭,但是要记住,只要是原始数据类型,就这几种。

PS:ES6引入新的基础数据类型:Symbol。(当然这是刷题的时候见到的,没用过)

2、JS的引用数据类型

引用数据类型与基本数据类型的区别与Java类似,引用类型变量存储地址,而基本数据类型存储值。

典型的引用类型有:函数、数组、对象,关于这三者的详细学习在下面。

ps:函数和数组本质上都是JS中的对象,它们具有对象的属性和方法。

五、JS引用数据类型之函数

  • 一段可执行代码的合集,在需要执行的时候可以在方法名之后添加一对小括号执行方法,是一段可执行的字符串。
  • 函数可以看成功能完整的对象Function。

1、函数定义

函数定义时形参类型不用写。

普通函数的定义:

//普通方法定义函数
function mx(a,b){
return a+b;
}
//执行函数
mx(1,2);

动态函数定义:参数列表中先书写全部参数,最后一个参数需要书写方法体。

//动态函数定义
var mx = new Function("a","b","return a+b");

匿名函数定义(直接函数定义):

var mx = function(a,b){
return a+b;
};

2、arguments对象

在函数中有一个隐藏的对象arguments,其中保存的是用户输入的全部参数,可以通过arguments.length获取用户输入参数的长度。

function add(){
alert(arguments[0]);
}

3、函数属性

Function对象具有length属性,表示函数期望的参数个数。

4、函数的另类之处

与其他程序设计语言不同,ECMAScript 不会验证传递给函数的参数个数是否等于函数定义的参数个数。

  • 如果用户输入的参数长度大于规定长度,多余的参数并没有被抛弃,不会报错。

  • 如果用户的输入的参数长度小于规定长度,则缺少的参数会使用undefined来赋值。

以上两点可以利用arguments对象及其属性来检验。

在js函数中可以认为函数是一种特殊的变量,这个变量既可以作为参数使用,也可以作为方法使用。

  • 作为参数使用:直接书写方法名即可。
  • 作为方法使用:在方法名之后添加小括号,即为方法使用。

六、JS引用数据类型之数组

数组也可以看成是JS中的Array对象。

1、数组特点

在JS中,数组的本质就是用一个中括号括起来,其中添加任意类型的元素,每个元素用逗号隔开的字符串。

  • 数组的长度是任意的。

  • 数组存储的元素类型是任意的。

2、数组创建

普通数组定义

var arr = new Array();//返回数组为空,length为0

加上初始容量的普通数组定义

var arr = new Array(3);//如果传入参数为数字,则表示指定容量,返回长度为3,元素为undefined的数组

含有初始值的数组定义

var arr = new Array(1,"a",false,new Object());

直接量数组定义

var arr = [1,true,"bb"];

3、数组方法

join(参数):将数组中的元素按照指定的分隔符拼接为字符串

Pop():删除最后一个元素,并返回

push():向末尾添加元素,并返回新的长度

shift():删除第一个元素,并返回

部分API,详情见API参考文档。

4、数组属性

length:数组长度

七、JS引用数据类型之对象

关于对象的类型的题目,在牛客网遇到之后,评论区简直神仙打架,啥观点都有。关于这部分总结,将参考自:

ECMAScript 对象类型

该教程中说明:可以创建并使用的对象可以分为三种:本地对象、内置对象、宿主对象。

1、本地对象(native object)

Object:和Java中的Object类相似,所有的ECMAScript对象都继承自Object对象,也具有Object对象的属性和方法。如constructor属性和prototype属性,Valueof()方法等。

Boolean:Boolean原始类型的包装对象。

Number:Number原始类型的包装对象。

String:String原始类型的包装对象。

Function:函数类型的包装对象,意思是我们定义的函数可以看成功能完整的对象。

var mx = new Function("a","b","return a+b");//动态创建Function对象,但不建议这样创建

//下面这条语句看似将函数传给一个变量很奇怪,其实是有说法的:
var mt = mx; //mt与mx指向同一函数,它们都可以执行该函数代码。

Array:数组类型的包装对象,意思是我们创建的数组可以看成功能完整的对象。

Date:日期事件对象,封装了许多和日期实现相关的方法,如toLocaleString()等。

RegExp:正则对象,保存有关正则表达式模式匹配信息的固有全局对象。

var reg = new RegExp(pattern,attributes);//pattern匹配模式,attributes参数可选,指定匹配方式
var reg = /pattern/attributes;
//测试方法
var result = reg.test(str);//判断str是否符合正则匹配

Error以及各种错误类型,如:URIError、SyntaxError、TypeError、ReferenceError、RangeError、EvalError等。

2、内置对象(built-in object)

其实也是本地对象,只是不需要我们显式地实例化内置对象。

Global

全局对象,它多拥有的函数和属性可用于所有内建的JS对象。

以下为部分Global全局对象的函数:

  • parseInt():将字符串转换为数字,这个方法很奇特,它会逐一判断每一个字符是否位数字,直到不是数字位置,将前面的数字部分转换为Number。如parseInt("123aba123")的结果是123,Number类型。

  • isNaN():该方法用于判断该值是否为NaN。(ps:是因为不能单纯通过xx==NaN的值来判断xx是否为NaN,因为NaN和任何值做==运算都为false,包括自己,无法以此作为判断依据)

  • eval():该方法将计算JS的字符串,将字符串转换为脚本执行。如:eval("alert(123)");将会执行alert语句。

Math

用于执行数学任务,内置对象无需构造函数Math(),直接使用即可。如:Math.max(1,2);

3、宿主对象(host object)

由ECMAScript实现的宿主环境提供的对象,我们之后学习的BOM和DOM对象都是宿主对象。

4、关于对象的补充

除了上述的对象,我们也可以自定义对象。定义的格式如下:

自定义对象的方法

无参构造

function Person() {
}
var p = new Person();
p.name = "天乔巴夏";
p.age = 18;
p.gender = "male";
//定义方法
p.say = function () {
return this.name + " say......";
};
//打印对象
console.log(p);

含参构造

//含参构造
function Student(name, age) {
this.name = name;
this.age = age;
} var student = new Student("天乔巴夏", 18);
//直接添加属性
student.addr = "hangzhou";
console.log(student);

直接量构造

var p = {
name: "天乔巴夏",
age: 18,
say: function () {
return this.name + " say......";
}
};
console.log(p);

自定义对象的操作

delete语句:删除对象的属性或函数

delete p.say;

with语句:定义了某个对象的作用域,域中可以直接调用该对象的成员。

with(student){
alert(name);
}

for……in语句:遍历对象所有属性的名称

for(var prop in p){
alert(prop);
}

八、JS中的自动类型转换

JS中的自动类型转换与Java对比,还是有很多不同之处的,JS在需要的时候会对以下类型进行相应的类型转化:

1、数字类型

  • 可转为字符串形式,比如在和字符串拼接的时候。
  • 可转为布尔类型,0为false,其他都为true。
  • 转化为Number对象(这点可以参考Java的自动装箱与拆箱)。

2、字符串类型

  • 可转化为对应的数值。但是需要注意的是:字符串和数字进行相加,将会转为字符串拼接。当字符串和数字进行减运算时,如果可以的话,字符串会转化成对应的数值,然后进行减法运算。否则,将会返回一个NaN的值,如果可以的话,可以尝试使用parseFloat() 与 parseInt()方法对字符串先进行处理。
	console.log("123"-1);//122
console.log("abc123"-1);//NaN
  • 亦可转为布尔类型,空字符串为false,非空则为true。
  • 转化为String对象(这点可以参考Java的自动装箱与拆箱)。
<script>
var a = "123abc";
document.write(typeof(a)); //string
document.write(a+1); //123abc1
document.write(typeof(a+1)); //string
document.write(parseInt(a)); //123
</script>

3、布尔类型

  • 需要的时候可转为数字类型,true为1,false为0。
  • 需要的时候可以转化为对应字符串。
  • 转化为Boolean对象(这点可以参考Java的自动装箱与拆箱)。

4、对象类型

  • 可转为布尔类型,对象为null,则为false,其余都是true。

5、其他情况

  • null和undefined都是false。

九、JS中的运算符

JavaScript中的运算符大致上和Java相同,需要注意一些特别的点:

1、特殊运算符typeof

将会返回一个操作表达式的数据类型的字符串。

对于Undefined,Boolean,Number,String等基本类型的变量,typeof的结果是这四个的小写形式。

对于引用类型的变量,或者Null基本类型的变量,typeof的结果是object。

2、与=

两者都是比较两边是否相等,区别在于:比较的时候,会进行类型转换(划重点,类型转换),而=则先判断类型是否相等,再判断值是否相等。

console.log(123 == "123");//true
console.log(123 === "123");//false

3、加减乘除运算

浮点数运算时,由于底层存储问题,将会导致出现精度缺失的情况。

console.log(1.1+2.2);//3.3000000000000003

运算之后,如果结果可以转换成整型,将会以整型的形式显示。

console.log(1.2+1.8);//3

整型/整型的结果不是整型。

console.log(3/2*100);//150

4、三元运算符

2+3>4 ? console.log(true):console.log(false)//true

十、JS中的流程控制语句

一些和Java相同的流程控制语句就不多说了,如for循环,while循环,do……while循环语句等。

值得注意的有以下两个:

1、switch语句

在Java中:switch条件可以接收byte,int,short,char,枚举和字符串类型。

在JS中:switch条件可以接收任意的原始数据类型。

2、if语句

我们知道,if语句中的条件需要是一个布尔值。下面的代码,在Java中是不允许的,而在JS中允许:意思是,将4赋值给变量x,此时变为if(4),而4会自动转换成true,这样子的话程序原本的语义将会被破坏。我们可以将条件稍作修改,改为if(4 == x),可以有效地规避粗心导致的错误。

if(x = 4){
//do 1
}else{
//do 2
}

3、其他

和上面一样,有了许多类型和布尔类型的转换之后,可以利用数字或对象作为判断条件。

while(1){
//do
}//死循环
if(obj){
//do
}//空指针判断

十一、JS中的变量

1、变量的定义

使用关键字var来定义变量,定义的变量为弱类型的变量,可以为这个类型的变量赋任意数据类型的值。

区别于Java,弱类型意思是:在开辟变量存储空间 时,不定义空间将来存储的数据类型,可以存放任意类型的值。

var a = 1;
a = "abc";

使用var定义,在没有给定初始值时,其类型为undefined。

var a;
console.log(typeof(a));//undefined

2、全局变量和局部变量

用var定义的变量即为局部变量,没有用var定义的变量为全局变量。

var a = 4;	//局部变量
a = 4; //全局变量

参考:W3School

【学习笔记】:JavaScript基础知识超详细总结!的更多相关文章

  1. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

  2. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

  3. C#学习笔记(基础知识回顾)之值传递和引用传递

    一:要了解值传递和引用传递,先要知道这两种类型含义,可以参考上一篇 C#学习笔记(基础知识回顾)之值类型和引用类型 二:给方法传递参数分为值传递和引用传递. 2.1在变量通过引用传递给方法时,被调用的 ...

  4. C#学习笔记(基础知识回顾)之值类型和引用类型

    一:C#把数据类型分为值类型和引用类型 1.1:从概念上来看,其区别是值类型直接存储值,而引用类型存储对值的引用. 1.2:这两种类型在内存的不同地方,值类型存储在堆栈中,而引用类型存储在托管对上.存 ...

  5. Quartz学习笔记:基础知识

    Quartz学习笔记:基础知识 引入Quartz 关于任务调度 关于任务调度,Java.util.Timer是最简单的一种实现任务调度的方法,简单的使用如下: import java.util.Tim ...

  6. Docker的学习笔记(一)基础知识

    概述 本人最近在学习docker相关的知识,既是工作本身的需要也是自己对技术的追求的必要,以后我也会推出容器相关的随笔,既可以增长自己的知识,也可以和读者广泛交流,岂不乐乎?话不多说.第一篇先介绍do ...

  7. .net学习笔记---xml基础知识

    一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基 ...

  8. Scala学习笔记--正则表达式基础知识、如何在scala内使用

    正则表达式语法:https://msdn.microsoft.com/zh-cn/library/ae5bf541(VS.80).aspx 基础知识:正则表达式30分钟入门教程 http://www. ...

  9. (C/C++学习笔记) 一. 基础知识

    一. 基础知识 ● 程序和C/C++ 程序: 根据Wirth (1976), Algorithms + Data Structures = Programs. Whence C: 1972, Denn ...

随机推荐

  1. 关于爬虫的日常复习(9)—— 实战:分析Ajax抓取今日头条接拍美图

  2. JavaScript(1)---绑定事件、解除绑定事件

    JavaScript(1)---绑定事件.解除绑定事件 一.事件概述 1.事件的几个概念 · 事件 指的是文档或者浏览器窗口中发生的一些特定交互瞬间.我们可以通过侦听器(或者处理程序)来预定事件,以便 ...

  3. 2.Markdown学习

    Makrdown学习: 1.推荐编辑器: Typora [点击跳转](https://www.typora.io/) 2.标题: #空格一级标题名 ##空格二级标题名 3.字体: 粗体:** ** H ...

  4. Zero down time upgrade with OGG -from 11g to 12c.

    High level steps upgrade from 11g to 12c database: 1)    Check network between source and target. 2) ...

  5. CSS基础应用总结

    目录 CSS 样式笔记 文字水平居中和垂直居中 如何设置a标签不带下划线 控件右对齐 div上下居中 控件左右居中 控件展示在同一行 设置文字超出部分...显示 CSS 样式笔记 文字水平居中和垂直居 ...

  6. linux 命令全名

    su:Swith user  切换用户,切换到root用户cat: Concatenate  串联uname: Unix name  系统名称df: Disk free  空余硬盘du: Disk u ...

  7. Spring JSTL 获取后端数据失败。

    显示的jsp页面仍是${XXX}的形式. 解决方法一: 这是因为我们在web.xml中使用的是jsp1.2版本的DTD,在此版本JSTL默认不打开,我们需要手动打开,打开方法: 在相应的JSP头部加入 ...

  8. 双括号(()),shell与C++的桥梁

    使用语法: ((表达式))用来扩展Shell中的算术运算,以及赋值运算,扩展for,while,if条件测试运算. 注意点: 1.在双括号结构中,所有的表达式可以像c语言一样,如a++,b-- 2.在 ...

  9. Activity--Eclipse安装Activity designer插件失败

    案例 今天使用Eclipse 安装Activity designer插件时,出现了如下错误: An error occurred while collecting items to be instal ...

  10. C语言系列之自增自减运算符的用法(二)

    运算符中最难理解的有自增自减运算符的使用方法,下面我将简单总结一下他们的使用方法 我们知道,C语言运行是由右向左运行的 下面我们来看一个例子 当i等于3的时候 j=++i; 由上面可知,C语言是由右向 ...