JavaScript-进阶篇(一)之变量

变量

变量就是保存数据的容器

命名

变量名:
1.$ _ 字母 数字,数字不能开头
2.区分大小写
3.关键字: if for...
保留字: class...

声明
var score;
score = 4;

var score = undefined;
score = 4; 

var score = 4;

var aScore = 8;
var bScore = 1;

var aScore = 8,
    bScore = 5;
数据类型

基本类型 : 4 'str' true/false undefined null
引用类型 : [] {}

区别:基本类型值不会改变,引用类型会改变

var num = 6;
num = 5 //覆盖
var person = 'person';
person.name = 'xiaoming';
console.log(person.name);   //undefined
堆栈

image.png

基本类型保存在栈中,栈的空间的是有序且大小固定的,而堆中是大小不固定且无序的.在栈中保存的引用类型是一个引用地址

相等比较
var a = 4;
var b = 4;
console.log(a === b);   //true

var xm = {
    age:18,
    scroe:4;
};
var xh = {
    age:18,
    score:4
}
console.log(xm === xh);     //false

由于对象之间的比较是判断的地址是否相等,每个地址开辟了不同的堆内存空间,因此只有当两个变量是同一个对象的引用时,才相等

var xm = {
    age:18,
    scroe:4;
};
var xh = xm;
console.log(xm === xh);     //true 
function equal(a,b){
    for(var p in a){
        if (a[p] !== b[p]) return false;
    }
    return true;
}
console.log(equal(xm,xh));      //true
复制变量的值
var xm = 4;
var xh = xm;
xm++;
console.log(xm);    //5
console.log(xh);    //4
参数传递
//基本类型的参数传递
function addTen(){
    return num + 10;
}
var score = 10;
console.log(addTen(score));     //num = score;
//引用类型的参数传递
function setName(obj){
    return obj.name = 'xm';
}
var person = {}
setName(person);
console.log(person.name);    //obj = person 传递了对象地址的值
function setName(obj){
    obj.name = 'xm';
    obj = {};   //此时的Obj不再是person
    obj.name = 'xh';
}
var person = {};
setName(person);
console.log(person.name);   //xm
检测类型
//typeof
console.log(typeof 3);      //number
console.log(typeof 'str');      //string
console.log(typeof true);       //boolean
console.log(typeof undefined);      //undefined
console.log(typeof null);       //object
console.log(typeof []);     //object
console.log(typeof {});     //object
console.log(typeof function(){});       //function
console.log(typeof /a/ );       //object
//instanceof      只能和引用类型使用
console.log([] instanceof Array);   //true
console.log([] instanceof Object);  //true
console.log({} instanceof Object);  //true
console.log({} instanceof Array);   //false
全局作用域和局部作用域
  • 变量的生命周期
  • 访问到变量
var name = 'greentea';    //全局作用域的生命周期在脚本执行完毕才会销毁
function fn(argument){
    var sex = 'male';    //局部作用域在函数执行结束即销毁
}
fn();

没有块级作用域

变量对象和作用域链
var name = 'xm';
function fn(){
    var sex = 'male';
    var name = 'xh'
    function fn2(){
        var name = 'xhei'
        var age = 18;
    }
}
console.log(window.name === name);      //true

全局作用域的变量对象是window,而局部作用域的变量对象是显示不出来的.
查找变量先从当前作用域中查找,如果没有向上一层查找

预解析
var name = 'xm';
var age = 18;
function fn(){
    console.log(name);  //undefined
    var name = 'xh';
    var age = 10;
}
fn();

JS的解析过程:
1.预解析
由全局向局部预解析.首先,将所有的变量var赋值undefined.然后将函数声明
如果变量名和函数名相同,则只存在函数名
2.逐行解读代码

解析机制详解

问题一:

//1
console.log(b);      //undefined
var b = 1;

//2
console.log(a);      //报错
a = 1;

预解析先去找var,因a没有var,导致报错

console.log(a);
var a = 1;
console.log(a);
function a(){
    console.log(2);
}
console.log(a);
var a = 3;
console.log(a);
function a(){
    console.log(4);
}
console.log(a);
a();

//预解析先会将var a = undefined,但是又有a的function,因此,a变量被function替代,只剩下function a.
//然后a被赋值为1,3...最后执行a(),因为a被赋值后是变量,所以会报错
var a = 1;
function fn(){
    console.log(a);     //undefined
    var a = 2;
}
fn();
console.log(a);
//首先预解析var定义undefined,在fn()中的预解析中a定义为undefined.因此a为undefined
var a = 1;
function fn(){
    console.log(a);     //1
    a = 2;
}
fn();
console.log(a);     //2
//里面没有var,就在外面去找,然后a = 2是全局的,因此为2
var a = 1;
function fn(a){
    console.log(a);     //undefined
    a = 2;
}
fn();
console.log(a);     //1
//参数相当于var
var a = 1;
function fn(a){
    console.log(a);     //1
    a = 2;
}
fn();
console.log(a);     //1
//传进来以后是全局变量了
垃圾回收机制

释放无用的数据,回收内存

自动:JS
手动:Objective-C
原理:找出那些没用的数据,打上标记,释放其内存,周期性执行,标识无用数据的策略
标记清除:离开其作用域以后,会被清除
引用计数(不常用)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,926评论 6 13
  • 第1章 JavaScript 简介 JavaScript 具备与浏览器窗口及其内容等几乎所有方面交互的能力。 欧洲...
    力气强阅读 1,118评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • 1.蕙兰的套路 王宝刀从松鹤楼出来的时候脚步轻摇,小脸微醺。 今天的酒不错,深埋地下十八年的女儿红,泥封破开,清冽...
    林陌鹿阅读 1,532评论 7 11
  • 朋友问,上篇文章«夏梦,巨蟹座的孤单»为什么伤感。 其实,只是心知道,岁月并不宽宏,夏流过了秋,冬转成了春,所有浓...
    苍贤者阅读 414评论 0 0