本片博客记录了我JavaScript筑基阶段的学习内容,JavaScript不是Java,但是我下意识的把它和java对比学习,有些地方比较有趣,有些地方从java角度看,简直匪夷所思,不过现在总体感觉下来,还算不错(不涉及ES5 ES6)
- 变量&数据类型
- 表达式和语句
- 函数
- 作用域
- 预解析
- 对象
弱类型数据结构&变量
对习惯了强类型的java粉来说,倒是觉得js的弱类型还不错,不管是Number String Boolean Null Undefined 还是对象, 函数一个var 全部接收
js 没有字符类型,也就是说, “” 和 ‘’ 里面都可以放字符串
表达式和语句
- 分支结构
if(){}
switch语句
三元运算符
while(){}
循环,doWhile()循环
- 三元运算符
上面的5条,和java基本完全相同
6 for循环有点差异
1 | for(var i=0;i<100;i++){ |
- 隐式转换
就有说和java的不同点
1 | // 隐式转换: 仅限 减 字符串 - 数字, 浏览器会给我们隐式转换成数字 |
函数
常用的函数声明
1 | function(){ |
函数表达式
1 | var fn=function(){ |
函数的参数:
下面的代码, 入参是没有类型,这可以对习惯了java的人来说,是一件无法想象的事,对于js,大家都是var,也就省略了,加上反倒是报错了
1 | function (a,b){ |
函数的返回值:
直接return就好了
1
2
3
4 function (a,b){
//body
return XXX;
}
可变参数:
我们知道,在java中我们可以通过三个点,表示可变参数,js更方便了,方便到我们在声明函数有可变参数时,三个点都不用写了
我们通过 arguments
可以动态的获取出有几个参数,每个参数具体是谁,如下例:
1 | function MyMath() { |
作用域
- 全局变量和局部变量
js全局变量局部变量的特性和java一样, 着重提一下,下面几点:
- 不使用var定义的变量是全局变量
- 变量在退出作用域后被销毁
- 全局变量在关闭浏览器后被销毁
- 一对 花括号,称为 一个块级作用域
- 作用域链(实际就是函数的嵌套)
如下代码:
1 | > 当前函数里如果不存在num,她会去上一级函数里面查找 |
输出结果: 789
预解析
- 变量提升
如下, 浏览器不会报错而是会把变量提升1
2
3
4
5
6
7console.log(a);
var a=1;
//等同于:
var a;
console.log(a);
a=1;
结果 : undefined
- 函数提升例一
1 | var num = 10; |
结果: undefined
2.1 函数提升例2
1 | f1(); |
解释性,脚本,动态类型,基于对象
对象
说起对象,都是对一些属性和行为的封装,js同样是这样,但是js的对象的属性–太自由了,以至于让习惯了java编程风格的人不得不小心,最直观的就是点运算符不能随便用
三种常用的创建对象方法
- 对象字面量
1 | var o={ |
- new 关键字
1 | var person = new Object(); |
点运算符给对象添加属性,难以想象吧!!! , 一个对象都new 出来了, 还可以给他添加属性,添加函数, 没错,js就真的可以
- 工厂函数创建对象
1 | function createPerson(name,age){ |
4 . 自定义构造函数
1 | function Person (name,age){ |
操作对象的属性方法
- 获取属性 例:
1 | person["name"] |
这里我觉得说一百遍都不过分,点,不能随便用,因为如果对象没有这个属性,我们却 .新属性 那么就会给对象新添加新的属性, 但是上面的Object[“key”] 就不会出现这种情况
堆栈
js中变量,对象 在堆栈的分布情况和Java一样, new 出来的对象全部放在堆 ,简单类型的数据变量全部位于栈
例:
1 | // 下面代码输出的结果 |
解释上面代码执行过程,及堆栈空间的分配
- 执行 var p = new Person(“zs”,18,1000) –> 在堆中开辟空间存new 出来的Person 在栈开辟空间放p 存我们new的对象的在堆中的地址
- 执行: console.log(p.name); // zs – > 得到结果 zs
- 执行f1(p); – > 把p里面存放的我们new 的Person的地址拷贝给函数的入参位置的person, 此时person和p都指向Person , 紧接着,person改变了在堆中的Person的name为ls , 然后 在堆中新开辟一片空间存新Person,并且让 栈中的person指向新Person
- console.log(p.name); //ls —> 此时,p依然指向Person 而 person指向新Person , 所以结果是 ls
常见的内置对象
Math/Array/Number/String/Boolean
Date
1 | // 获取年份 |
不可变的String
1 | var str = 'abc'; |
Array
1 | indexOf(元素值) //返回值是索引,没有则返回 -1 |
json格式的数据
1 | var json={ |
基本包装类型
基本包装类型 string number boolean 这三个类型本来就是基本类型, 也可能是基本包装类型
1 | var str ="hello"; |
到此入门接近尾声了,但是js的学习还有很长一段路,
- ES5 ES6新特性
- js操作 DOM— Document Object Model 文档对象模型
- js操作 BOM— Browser Object Model 浏览器对象