本片博客记录了我JavaScript筑基阶段的学习内容,JavaScript不是Java,但是我下意识的把它和java对比学习,有些地方比较有趣,有些地方从java角度看,简直匪夷所思,不过现在总体感觉下来,还算不错(不涉及ES5 ES6)

我会从如下几个方便展开

  • 变量&数据类型
  • 表达式和语句
  • 函数
  • 作用域
  • 预解析
  • 对象

弱类型数据结构&变量

  • 对习惯了强类型的java粉来说,倒是觉得js的弱类型还不错,不管是Number String Boolean Null Undefined 还是对象, 函数一个var 全部接收

  • js 没有字符类型,也就是说, "" 和 '' 里面都可以放字符串

表达式和语句

  1. 分支结构if(){}
  2. switch语句
  3. 三元运算符
  4. while(){}循环,doWhile()循环
  5. 三元运算符

上面的5条,和java基本完全相同

6 for循环有点差异

for(var i=0;i<100;i++){
// do
} // 可以写 in 语句
for(var key in Object){
// do
}
  1. 隐式转换

就有说和java的不同点

// 隐式转换: 仅限 减  字符串 -  数字,     浏览器会给我们隐式转换成数字
console.log("10"-5);
console.log("5"-10);

函数

常用的函数声明

function(){
// 函数体
}

函数表达式

var fn=function(){
// body
}

函数的参数:

下面的代码, 入参是没有类型,这可以对习惯了java的人来说,是一件无法想象的事,对于js,大家都是var,也就省略了,加上反倒是报错了

function (a,b){
//body
}

函数的返回值:

直接return就好了

function (a,b){
//body
return XXX;
}

可变参数:

我们知道,在java中我们可以通过三个点,表示可变参数,js更方便了,方便到我们在声明函数有可变参数时,三个点都不用写了

我们通过 arguments 可以动态的获取出有几个参数,每个参数具体是谁,如下例:

function MyMath() {
// 给对象添加一个方法--- 函数在定义的时候, 入参如果可变,那就不用写了, 就像下面那样,运行时会动态的检测出来参数有几个, 每个参数是谁
this.getMax=function(){
var max = arguments[0]
for(var i=1;i<arguments.length;i++){
if(max<arguments[i]){
max=arguments[i];
}
}
return max;
}
} var myMath = new MyMath();
var max = myMath.getMax(1,2,3,4,5);
console.log(max);

作用域

  1. 全局变量和局部变量

js全局变量局部变量的特性和java一样, 着重提一下,下面几点:

  • 不使用var定义的变量是全局变量
  • 变量在退出作用域后被销毁
  • 全局变量在关闭浏览器后被销毁
  1. 一对 花括号,称为 一个块级作用域
  2. 作用域链(实际就是函数的嵌套)

如下代码:

> 当前函数里如果不存在num,她会去上一级函数里面查找

function f1() {
var num = 123;
function f2() {
var num = 789;
console.log( num );
}
f2();
}
var num = 456;
f1();

输出结果: 789

预解析

  1. 变量提升

如下, 浏览器不会报错而是会把变量提升

console.log(a);
var a=1; //等同于:
var a;
console.log(a);
a=1;

结果 : undefined

  1. 函数提升例一
var num = 10;
fun();
function fun() {
console.log(num); // undefined
var num = 20;
} // 等同于 var num;
num=10; function fun() {
var num;
console.log(num); // undefined
num = 20;
}
fun();

结果: undefined

2.1 函数提升例2

f1();
console.log(c); // undifined
console.log(b); //
console.log(a);
function f1() {
var a = b = c = 9;
console.log(a); //9
console.log(b); //9
console.log(c); //9
} // 等同于 function f1() {
var a = b = c = 9; // b c 没有被var修饰,是全局变量,但是在想让倒数2-3行不报错就得提前执行f1()
console.log(a); //9
console.log(b); //9
console.log(c); //9
}
f1();
console.log(c); // 9
console.log(b); // 9
console.log(a); // 没结果

解释性,脚本,动态类型,基于对象

对象

说起对象,都是对一些属性和行为的封装,js同样是这样,但是js的对象的属性--太自由了,以至于让习惯了java编程风格的人不得不小心,最直观的就是点运算符不能随便用

三种常用的创建对象方法

  1. 对象字面量
var o={
name:"张三",
age:"12",
sayHello:function(){
//do
}
}
  1. new 关键字
var person = new Object();

// 点运算符给对象添加属性
person.name="张三";
person.age="23";

点运算符给对象添加属性,难以想象吧!!! , 一个对象都new 出来了, 还可以给他添加属性,添加函数, 没错,js就真的可以

  1. 工厂函数创建对象
function createPerson(name,age){
var obj new Onject();
obj.name=name;
obj.age=age; obj.sayHi=function(){
//do
}
return obj;
}
// 获取对象
var p = createPerson("张三",23);

4 . 自定义构造函数

function Person (name,age){
this.name=name;
this.age=age;
this.sayHello=function(){
// do
}
} // 获取对象
var per = new Person("张三",23);

操作对象的属性方法

  1. 获取属性 例:
person["name"]
person.name

这里我觉得说一百遍都不过分,点,不能随便用,因为如果对象没有这个属性,我们却 .新属性 那么就会给对象新添加新的属性, 但是上面的Object["key"] 就不会出现这种情况

堆栈

js中变量,对象 在堆栈的分布情况和Java一样, new 出来的对象全部放在堆 ,简单类型的数据变量全部位于栈

例:

// 下面代码输出的结果
function Person(name,age,salary) {
this.name = name;
this.age = age;
this.salary = salary;
}
function f1(person) {
person.name = "ls";
person = new Person("aa",18,10);
} var p = new Person("zs",18,1000);
console.log(p.name); // zs
f1(p);
console.log(p.name); //ls

解释上面代码执行过程,及堆栈空间的分配

  1. 执行 var p = new Person("zs",18,1000) --> 在堆中开辟空间存new 出来的Person 在栈开辟空间放p 存我们new的对象的在堆中的地址
  2. 执行: console.log(p.name); // zs -- > 得到结果 zs
  3. 执行f1(p); -- > 把p里面存放的我们new 的Person的地址拷贝给函数的入参位置的person, 此时person和p都指向Person , 紧接着,person改变了在堆中的Person的name为ls , 然后 在堆中新开辟一片空间存新Person,并且让 栈中的person指向新Person
  4. console.log(p.name); //ls ---> 此时,p依然指向Person 而 person指向新Person , 所以结果是 ls

常见的内置对象

Math/Array/Number/String/Boolean

Date

//  获取年份
console.log(new Date().getFullYear());
// 获取月份
console.log(new Date().getMonth()+1); // 从零开始的 0-11
// 获取日期
console.log(new Date().getDate());
// 获取小时
console.log(new Date().getHours());
// 获取分钟
console.log(new Date().getMinutes());
// 获取秒
console.log(new Date().getSeconds());
// 获取星期
console.log(new Date().getDay());

不可变的String

    var str = 'abc';
str = 'hello';
// 当重新给str赋值的时候,常量'abc'不会被修改,依然在内存中
// 重新给字符串赋值,会重新在内存中开辟空间,这个特点就是字符串的不可变
// 由于字符串的不可变,在大量拼接字符串的时候会有效率问题 length 长度
chatAt(索引) //返回指定位置的字符 超出返回空
concat(string1,string2....) //把多个字符串拼接起来
str.indexOf//(要找的字符串,开始检索的位置) 在str中,在指定的位置查找我们指定的字符串
replace(str1,str2) // 使用 str2 替换str1
slice(4,6) //从索引为4的位置开始提取, 到6的前一个结束,没有6
split(切面标记) //根据标记切割字符串,返回切割后的字符串的数组
substr(5,5)//从5开始,截取五个(长度) 第二个参数可以不写
subString(5,6) //从5开始 到六的前一个结束, 返回截取后的字符串
toLocalLowerCase() // 转小写
toLowerCase() // 转小写
trim() //去掉字符串两边的空格
indexOf(str) //找出str在字符串中第一次出现的位置

Array

   indexOf(元素值)   //返回值是索引,没有则返回 -1
join(XXX) //在数组中的每一个元素之间添加一个 XXX ,返回字符串
map(function(){}) // 数组中的每一个元素都要执行 function(){} 返回一个新的数组
reverse() ;// 反转
sort(compareFunction) ;// 排序
slice(start,end) // 在指定的位置截取数组的元素
splice(start,要删除的个数,新添加的字段) //可以在指定的位置 插入,或者替换指定的位置的元素

json格式的数据

var json={
"name":"小明",
"age":"21"
}; // js是动态类型的语言, 只要我 点一下, 对象就有了点后的 属性或者方法
json.adsaodsoifd; // 此时对象添加属性 adsaodsoifd 只不过我没有给他赋值--- 打印结果是 undifined // 遍历
console.log(json.age);
console.log(json["age"]);
console.log(json["age","name"]); // 做不到全部输出!!! 输出的是name值, 也就是最后一个值 // for-in 循环遍历
for(var key in json){
console.log(key); // 输出 key值
console.log(json.key); // undefined 对象中没有这个属性,不能随便点!!! 这是在新添加属性
console.log(json[key]); // 取出 key 对应的值
}

基本包装类型

基本包装类型 string number boolean 这三个类型本来就是基本类型, 也可能是基本包装类型

    var str ="hello";
str= str.replace("ll","KK"); // 此时这里的str调用了方法,那么他就提升为了 基本包装类型,转而成为一个对象
console.log(str); // 缺陷 --
// true&&对象 为 后面的对象
// 对象&&true 为 后面的 true
var flag = new Boolean(false);
var result = flag && true;
console.log(result); var num =10; // 基本类型
num2=Number("10"); // 基本类型---这里仅仅是类型转换,并没有new 也没有调用方法属性,就不是基本包装类型

到此入门接近尾声了,但是js的学习还有很长一段路,

  • ES5 ES6新特性
  • js操作 DOM--- Document Object Model 文档对象模型
  • js操作 BOM--- Browser Object Model 浏览器对象

JavaScript -- 筑基的更多相关文章

  1. JavaScript筑基篇(二)->JavaScript数据类型

    说明 介绍JavaScript数据类型 目录 前言 参考来源 前置技术要求 JavaScript的6种数据类型 哪6种数据类型 undefined 类型 null 类型 boolean 类型 numb ...

  2. JavaScript筑基篇(一)->变量、值与对象

    说明 JavaScript中变量.值.对象的理解.本文为了简化理解,前半部分暂时刨除与执行上下文的相关概念.另外本文是个人的见解,如有疑问或不正支持,欢迎提出指正和讨论! 目录 前言 参考来源 变量与 ...

  3. JavaScript筑基篇(三)->JS原型和原型链的理解

    删除理由:很久以前写的,当时理解不够深入,这样描述反而看起来更复杂了.因此就删掉,免得误人子弟! 可以看看另一篇文章:[如何继承Date对象?由一道题彻底弄懂JS继承.](http://www.cnb ...

  4. JS高级学习笔记(1)- 数据类型及转换规则

    必读: Javascript对象Oject的强制类型转换 JavaScript筑基篇(二)->JavaScript数据类型 聊一聊valueOf和toString 深入理解JavaScript系 ...

  5. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  6. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  7. Javascript 的执行环境(execution context)和作用域(scope)及垃圾回收

    执行环境有全局执行环境和函数执行环境之分,每次进入一个新执行环境,都会创建一个搜索变量和函数的作用域链.函数的局部环境不仅有权访问函数作用于中的变量,而且可以访问其外部环境,直到全局环境.全局执行环境 ...

  8. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  9. 读书笔记:JavaScript DOM 编程艺术(第二版)

    读完还是能学到很多的基础知识,这里记录下,方便回顾与及时查阅. 内容也有自己的一些补充. JavaScript DOM 编程艺术(第二版) 1.JavaScript简史 JavaScript由Nets ...

随机推荐

  1. 线程中put(None)和主函数中put(None)的区别和用法

    ''' 初试生产者消费者模型代码 分析: 对象含有生产者.队列.消费者 Queue队列模块,不适合传大文件,通常传一些消息. ''' '''多生产者进程和多消费者进程''' #导入模块 from mu ...

  2. Vue基础简介

    目录 vue基础 一.导入vue 二.vue挂载点 三.vue变量 四.vue事件 五.vue文本指令 六.vue事件指令 七.vue属性指令 vue基础 一.导入vue 补充:vue的语句以及导入j ...

  3. java程序员面试经历(不忘初心,永不放弃,方得始终)。

    其实一直想静下心好好写一点博客,记录下青春,但一直忙于学习,写bug.....转眼间2017只剩下最后几天,岁月无情划过,不留痕迹,唯有稀疏地中海.哈哈,本篇文章主要是想分享下刚毕业入门找工作的一点小 ...

  4. 2019年12道RabbitMQ高频面试题你都会了吗?(含答案解析)

    RabbitMQ 面试题 1.什么是 rabbitmq 2.为什么要使用 rabbitmq 3.使用 rabbitmq 的场景 4.如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费 ...

  5. SpringBoot微服务电商项目开发实战 --- 分布式文件系统实现

    SpringBoot分布式开发系列文章已经持续了一段时间了,每一篇都有核心内容讲给大家.比如:分环境部署配置及服务端口号统一配置,子模块版本号管理及第三方jar依赖管理,单点登录实现,接口安全(签名+ ...

  6. c++-重载等号,数组,指针,字符串类

    重载 重载=操作符 1先释放旧对象资源 2用一个对象=给另外一个对象 3函数返回值当左值 返回一个引用 4 数组类 Array& operator=(Array& a1); 5 字符串 ...

  7. php yii 查看帮助时会调用具体脚本类的析构函数

    现象 执行 php yii 查看脚本有什么命令的时候,发现会调用我一个类中的析构函数的命令.并且不是一次调用,是3次,截图中有两次,还有一次输出完析构函数所在的类中的命令之后. 分析原因 在析构函数中 ...

  8. 使用SQL生成指定数据库的数据字典(MSSQL)

    USE DBNAME --指定要生成数据字典的数据库 GO SELECT 表名= CASE WHEN a.colorder= 1 THEN d.name ELSE '' END, 表说明= CASE ...

  9. 百度大脑EdgeBoard计算卡基于Resnet50/Mobile-SSD模型的性能评测

    ResNet模型 前言在上一次的测试中,我们从头开始训练了一个三个卷积层串联一个全连接层的输出,作为猫狗分类的预测的模型,这次我们自己训练一个ResNet模型,并在以下三个环境中进行性能的对比 AIS ...

  10. rest.css解决不同浏览器元素默认样式不同的问题

    html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, ...