标签:执行环境 aaa 栈内存 ini log 验证 name 类型 max
声明多个变量:var message, name, age;
重复声明无效,只看第一次声明【特殊:函数内形参 与 函数内的函数名(函数声明方式创建的函数) 重名,以函数名声明为准】
<script>
    console.log(typeof a);
    function a() {}
    var a = 10;
</script>
// 输出:function<script>
    var a = 10;
    
    function a() {}
    
    console.log(typeof a);
</script>
// 输出:number<script>
    (function(a) {
        console.log(a);
        var a = function() {}
        console.log(a);
    })(100);
</script>
// 输出: 100  函数体// 特殊情况
<script>
    (function(a) {
        console.log(a);
        function a() {}
        console.log(a);
    })(100);
</script>
// 输出: 函数体  函数体多次赋值有效,只看最后一次赋值
赋值 时 找变量,沿着作用域链,一直找到全局中,全局中没有便创建全局变量。
所以,没用var 声明的变量,是全局变量
var声明;注意区分:声明、初始化(赋值)var 声明。 不推荐typeof(变量)typeof 变量typeof(变量) = undefined:声明变量,但未初始化(赋值);如果未声明变量,则报错typeof(变量) = boolean:变量是布尔typeof(变量) = string:变量是字符串typeof(变量) = number:变量是数值typeof(变量) = object:变量是对象 或 nulltypeof(变量) = function:变量是函数undefinednullnull 和 undefined 是完全不同的两个值,但 null == undefined 返回 truetrue 、 falseBoolean()空字符串、0、NaN、null、undefined 转布尔值为 `false`
特殊:空对象 转布尔值 为true二进制(0、1)
八进制(第一位是0,范围0 ~ 7)
十进制(0 ~ 9)
十六进制(开头是0x,范围0 ~ 9,A ~ F 字母部分大小写)
浮点数值:浮点数值中必须有一个小数点,且小数点后最少有一位小数;
浮点值计算不准确
内存空间:整数值内存空间的两倍 === 浮点数值内存空间;所以 1.0 会被转为整数值 1 再被存储isFinite()最小值:Number.MIN_VALUE 
最大值:Number.MAX_VALUE
正无穷:Infinity
负无穷:-Infinity isNaN() 验证是不是一个数值,会发生隐式转化isNaN(NaN);     // true
isNaN(10);      // false
isNaN("10");    // false (默认转为数值)
isNaN(true);    // false (true转为1)
isNaN("blue");  // true
isNaN("aa11");  // trueNumber() 可用以任何数据类型;特殊情况(转换非纯数值的字符串、对象、undefined值为NaN;转换布尔值、null、纯数值字符串,可转为数值)parseInt(string / number, radix)(第二个参数转为几进制):字符串开头如果不是数字,则返回NaN;字符串开头是数字,一直解析到不是数字的停止且不会保留小数parseFloat(string / number):字符串开头如果不是数字,则返回NaN;字符串开头是狮子,一直解析到不是数字的停止且会保留小数toFixed(几位小数) 保留几位小数; ---> 返回字符串parseInt(‘112ac.44‘);       // 112
parseInt(‘ac112.44‘);       // NaN
parseFloat("34 45 66");     // 34
parseFloat(‘22.34a5‘);      // 22.34String(变量) 可以将任意类型的数据 转为字符串变量.toString() 不能转化null 和 undefined,会报错简单的数据类型属于基本类型值:null、undefined、boolean、number、string
深拷贝(保存在栈内存中):相当于 重新创建一个变量,两个值互不影响
复杂数据类型属于引用类型值:object
通过 . 的方式 为引用类型值得变量添加属性、方法 ---> 由此得出 JS是一门动态型的语言,数据松散型。
浅拷贝(保存在堆内存中):引用类型的变量实际上包含的并不是对象本身,而是一个指向该对象的指针;从一个变量向另一个变量复制引用类型的值,实际上复制的是指针,两个变量最终指向同一个对象
delete 对象.方法 / 属性 删除 引用类型的 属性、方法
判断一个值是哪种基本类型用: typeof
判断一个值是哪种引用类型用:对象  instanceof 引用类型的构造函数,返回布尔值
全局执行环境被认为是window对象,所有全局变量都是 window的属性 和 方法
全局变量:直接在<script> </script> 中定义的变量
局部变量:在局部作用域重定义的变量;局部作用域之外是不能访问到的
局部作用域中:不用 var 声明的变量,会被自动添加到全局环境中
函数的局部环境不仅有权访问本级作用域,还可以访问父级作用域;父级作用域不能访问子级作用域【跨作用域访问变量,只能访问外层作用域,不能访问内层作用域】
所以并不是 { } 就是一个块级作用域;局部作用域只针对函数,不针对 if 、 for 语句
ES6 对 块级作用域 进行了改善
概念: 以函数为例,每一个函数都有一个作用域,这个作用域若包裹在其他函数中,包裹他的函数也有作用域,这样直到全局作用域,就形成了一条作用域链式结构,把这个链式结构称作:作用域链。
每次进入一个新的执行环境,都会创建一条用于搜索变量、函数的作用域链。
变量的声明提升
var aaa; 提升,赋值不提升
输出 未赋值的变量,结果为undefined
函数的声明提升【重要】
function  fn ()  {}    整体提升函数体
var  fn = function() {}   只提升var  fn ;当前作用域中,先提升变量 / 提升函数名;代码 从上到下,从左到右执行
发现函数调用,则回到函数创建区域执行函数
重复声明无效,只看第一次声明【特殊:函数内形参 与 函数内的函数名(函数声明方式创建的函数) 重名,以函数名声明为准】
函数声明方式创建:function fn() { } 预解析是把:整个函数体提前
函数表达式方式创建:var fn = function() { } 预解析是把:var fn; 提前
<script>
    console.log(typeof a);
    function a() {}
    var a = 10;
</script><script>
    var a = 10;
    
    function a() {}
    
    console.log(typeof a);
</script><script>
    (function(num) {
        console.log(num);
        num = 123;
        console.log(num);
    })(100);
</script><script>
    (function(a) {
        console.log(a);
        var a = function() {}
        console.log(a);
    })(100);
</script><script>
    (function(a) {
        console.log(a);
        function a() {}
        console.log(a);
    })(100);
</script><script>
    var x = 1;
    function a(x) {
        x = 2;
        return x;
    }
    a(x);
    console.log(x);
</script><script>
    var num = 123;
    function f1() {
        console.log(num);
    }
    f2();
    function f2() {
        num = 456;
        f1();
    }
    console.log(num);
</script><script>
    if (‘a‘ in window) {
        var a = 10;
        console.log(‘进入‘);
    }
    console.log(a);
</script>内存泄露:指程序中间动态分配了内存,但在程序结束时没有释放这部分内存;
重启计算机,或关闭程序 可以解决内存泄露
内存泄露,和计算机硬件没关系,和软件代码书写有关
JS垃圾自动回收机制原理:垃圾回收器,会间隔一段时间,将不再使用的 局部变量 销毁,释放其占用的内存
但 C、C#等语言,需要手动跟踪内存的使用情况
变量不在被引用,即释放掉内存
变量 = null;
<script>
    var cache = {};
    function fn4(m) {
        if (cache[m]) {
            return cache[m];
        }
        if (m === 1 || m === 2) {
            cache[m] = 1;
            return 1;
        } else {
            return cache[m] = fn4(m-1) + fn4(m-2);
        }
    }
    console.log(fn4(200));
</script>内存泄露是导致内存溢出的原因之一;内存泄露积累起来将导致内存溢出
内存泄露可以通过完善代码来避免
内存溢出可以通过调整配置来减少发生频率,但无法彻底避免
标签:执行环境 aaa 栈内存 ini log 验证 name 类型 max
原文地址:http://www.cnblogs.com/zxvictory/p/8001571.html