javascript

1、js浮点数计算精度不准确问题的解决办法:  js中的运算,都是先把他们转换为二进制再运算的。浮点数(小数点)的运算都会有偏差。

  解决方案 : https://www.cnblogs.com/xinggood/p/6639022.html

2、 js调用ocx控件(少数浏览器支持ocx控件),在<object>标签(classid的查找:注册表中搜索控件名(不包含后缀名),HKEY_CLASSES_ROOT\控件名.**\CLSID下对应的数据就是claissid)中加载好,js中通过getElementById获取到这个控件对象,在js中就可以直接使用控件的方法和属性了。

3、表单元素提交之后(不刷新)数据还是会存在的,想要提交之后清除数据可以在ajax提交数据后,用reset()方法清除数据。

4、js中 数值数字、字符串数字运算的总结:

  a、数字转换为字符串 : 全局方法String() 、Number 方法 toString()       参考:https://www.w3cschool.cn/javascript/js-type-conversion.html

  b、字符串转换成数字 : 全局方法 Number()、parseInt()  、parseFloat() ---parseFloat 方法转换后的数字,会把小数点后面的 0 自动去掉 。

  c、隐式转换  :  参考链接  或 https://www.cnblogs.com/chenmeng0818/p/5954215.html【推荐】

    • 对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字。数组会转化为逗号隔开的字符串。
    • 字符串可能会转化为数字,数字可能会转化为字符串。

     注意:加号比较特殊,+号 个字符串一起运算。是先把值隐身转换为 字符串的。而其他运算符,是隐身转化为数字的。

”+“ :  运算符或连接符,由于”+“号既具有连接符的功能,也有运算符的功能。所以 如果想让其执行运算符的功能,则需要将字符串转化为数字类型
其他运算符如: * 、/ 、- 都可以实现字符串和数字的直接运算,当然应为数字类型的字符串。

  d、保留n位小数,toFixed()

5、js的属性名可以是中文名字:https://blog.csdn.net/discoveryunknown/article/details/53556718 

  汉字作为变量名,所有的浏览器都是支持的。但是中文字符(符号)会有兼容性问题,最好不要使用:https://bbs.csdn.net/topics/350047936 

  体会:汉字作为js变量名,虽然不建议使用(从编程的国际化考虑)。但是在有些情况使用是非常方便的,比如,遍历有中文的数组,

  而且是以汉字的值进行条件判断的时候优势就非常明显。参考代码:https://www.echartsjs.com/gallery/editor.html?c=scatter-map

  感悟:从echarts官网中发现,这么使用。亲测过是有效的。

6、CSS、JS中的相对路径引用 :https://www.jianshu.com/p/963be59c0ef3

  在css中出现的相对路径,是以css文件所在路径为基准的,而js中的路径则是以导入此js的网页文件所在的位置为基准的。
       (服务器不去特殊配置,这个是对的。如果服务器把其它路径的页面,给当前请求的地址时,相对路径是以浏览器上的地址为基准的)

7、js中的循环语句:  https://www.cnblogs.com/wuxiaoshang/p/5843885.html  (1. for;2. while;3. do……while。工作中基本不会用到do……while,这里不说明)

  重点:1、for 循环,跳出循环语句:    break语句continue语句,前者终止整个循环,后者阻止某次循环的执行

     2、while 循环:不确定循环次数时使用。这个循环可以无限次循环下去,直到条件为 false 时结束(或者执行到break语句)。如果条件达不到就会变成一直循环下去,把页面搞崩溃。

8、js引擎的执行过程:https://www.cnblogs.com/duiniweixiao/p/8919673.html 或 https://www.cnblogs.com/weiqian/p/12559510.html(推荐)

  在JS引擎执行过程中,进入执行阶段后,代码的执行顺序如下:

宏任务(同步任务) --> 微任务(Promise) --> 宏任务(异步任务)

 

 

  个人理解的 js 事件循环 执行过程,应该是如下这样的:

 执行栈(同步任务)--> 微任务队列所有程序(推入执行栈执行)--> 宏任务队列最前面的一个(推入执行栈执行)-->  微任务队列所有程序(宏任务队列执行的程序 有 微任务,就会再次放在微任务队列) --> 宏任务队列前一个

 

9、js事件循环:

个人理解:

js执行栈执行完后,执行宏任务,宏任务执行完再执行下面所有的微任务。事件循环,再次执行宏任务,再执行下面所有的微任务。只有执行到有微任任务,会把微任务放到微任务队列中。当前执行栈,执行完就会执行微任务的。执行宏任务时,碰到微任务就会放微任务队列中,宏任务执行完,就会执行微任务队列所有程序。

总结起来:执行栈,执行完就会把微任务上所有程序放到执行栈中执行。执行完,再把宏任务队列的第一个程序放执行栈执行,执行完,再执行微任务队列的所有程序。

10、js的逗号表达式:https://www.cnblogs.com/hellolong/p/4210297.html 或 https://www.jianshu.com/p/f89f8b2762f3(推荐)

  最后整个逗号表达式的值是最后一个表达式的值。(逗号运算符是所有运算符里优先级最低的一个)

var num = (5, 1, 3, 8, 0); // num 的值为 0

11、在js中 {} 除了表示对象直接量外,还表示语句块。如果一个语句以“{”开头时,js引擎将{}解析为语句块

      参考  : https://www.cnblogs.com/binarytree-fe/p/4950798.html  或  https://www.cnblogs.com/52cik/p/js-label-block.html

  eg:下面语句在js中可以正常执行。

   {   alert("hello");  }

12、eval()的替代写法 : https://blog.csdn.net/xundh/article/details/48153121

13、js实现锚点跳转:scrollIntoView() 
    a 标签做不了逻辑判断,所以有的情况还是需要JS去瞄点跳转的。

element.scrollIntoView(); // 等同于element.scrollIntoView(true)
element.scrollIntoView(alignToTop); // Boolean型参数
element.scrollIntoView(scrollIntoViewOptions); // Object型参数, 可以控制是否过渡效果

14、js数据类型的判断:https://www.cnblogs.com/sunmarvell/p/9386075.html  或 https://www.cnblogs.com/Liang-Haishan216/p/6010912.html(说明更清晰)或 其它

  • typeof:typeof只能判断区分基本类型,number、string、boolean、undefined 和 object、function;
  • instanceof:
    var a={};
    a instanceof Object  //true
    a instanceof Array     //false
    var b=[];
    b instanceof Array  //true
    b instanceof  Object //true

    因为数组属于object中的一种,所以数组instanceof object,也是true。【 instanceof会沿着原型链去找是否属于某个类型,这种方式不精确

  • constructor:
    var str = "sdfs"
    str.constructor === String // true
    
    var o = {};
    o.constructor === Object  //true
    
    var arr = [];
    arr.constructor === Array  //true
    arr.constructor === Object //false

    唯一的缺点就是,constructor属性是可以被修改的,相对来说不安全。

  • Object.prototype.toString.call() 【推荐,比较常用】
    .toString()方法,返回对象的字符串表现。而 Array,function等类型作为Object的实例,都各自重写了toString()方法。所以直接调用他们自己的toString方法得不到需要的字符串。只能调用Object下面的toString方法,再通过call重新绑定下函数里面的this就可以了。
    Object.prototype.toString.call(123)  //"[object Number]"
    
    Object.prototype.toString.call('str')  //"[object String]"
    
    Object.prototype.toString.call(true)  //"[object Boolean]"
    
    Object.prototype.toString.call({})    //"[object Object]"
    
    Object.prototype.toString.call([])     //"[object Array]"
    
    Object.prototype.toString.call(null)  //"[object Null]"
  • Array.isArray():   https://juejin.cn/post/7000300249235357709#heading-5 
    Array.isArray() 用于确定传递的值是否是一个 Array。如果对象是 Array ,则返回true,否则为false。
    Array.isArray([1, 2, 3]); // true
    Array.isArray({foo: 123}); // false
    Array.isArray("foobar"); // false
    Array.isArray(undefined); // false

     

  总结:constructor 判断方法跟instanceof相似,但是constructor检测Object与instanceof不一样, constructor还可以处理基本数据类型的检测,不仅仅是对象类型

15、js中使用setAttribute给属性赋值和直接赋值对比:https://blog.csdn.net/czh500/article/details/88384118  或 https://zhidao.baidu.com/question/751498166110911164.html

  统一使用setAttribute来设置,直接赋值 会 出现 各种问题的。(取值一般是没有问题的,就像jquery里面的data()方法设置data属性,会出不可预期的问题)

  个人理解:原生js都是可以直接通过对象属性的方式读写属性(DOM.src)和样式(DOM.style.color)的。通过这种方式读写的操作都是在 js内存 里面操作的;但是DOM本身 没有的属性,赋值上这个属性,DOM树不会同步内存上的这个值。

       所以DOM属性 直接赋值,有的属性会有问题的。但是style对应的所有有效的属性都存在(有默认值),所以这样操作style样式是没有问题,都是这样操作的。

16、JS中值转化为布尔值时,为false值的6中情况:(其它情况都是true) https://www.cnblogs.com/zjx304/p/9782942.html

  • undefined(未定义,表示 缺少值)
  • null(代表空值)
    注意:null == undefind 为truenull 和其它类型数据判断 都是false。这就是JS中的一个bug,没有什么特别原因。
  • false(布尔值的false,字符串"false"布尔值为true)
  • 0(数字0,字符串"0"布尔值为true)  【转换时,0值要注意是否作为有效值使用
  • NaN(无法计算结果时出现,表示"非数值";但是typeof NaN==="number")
  • ""(双引号)或''(单引号) 【空字符串,中间有空格时也是true

17、JS中的对象遍历是有顺序的,只是不能完全保证顺序(遍历规则会根据 key 值类型的不同而不同)。https://blog.csdn.net/lucky__peng/article/details/124237202 

  • 在一个对象中,如果我们的 key 值是像 '1''200'这种正整数格式的字符串。 遍历的顺序是按照 key 值的大小来排列的。
    const obj = {}
    obj['10'] = 'a';
    obj['9'] = 'b';
    obj[8] = 'c';
    obj[7] = 'd';
    console.log(Object.keys(obj)) //  ["7", "8", "9", "10"]

    我们最后的遍历顺序完全忽视了插入顺序,并且,值得我们注意的是,在对象中,就算我们添加属性时的索引值是 Number 类型,最后的结果还是会被隐式的转为字符串。

  • 如果我们的 key 值是不能转为正整数的字符串,这其中包括了可以转换为负数的字符串( 如 '-1' )、小数格式的字符串(如 '1.0' ) 和其他的字符串。他们的遍历顺序会比较符合直觉,就是插入对象的顺序
    const obj2 = {}
    obj2['1.1'] = 'a';
    obj2['1.0'] = 'b';
    obj2['-1'] = 'c';
    obj2['jack'] = 'd'
    
    console.log(Object.keys(obj2)); //  ["1.1", "1.0", "-1", "jack"]

18、i++ 和 ++i 的区别:https://www.zhihu.com/question/22769675  【i++,++i都是一个表达式,表达式本身就会有一个运算结果】

  • i++:运算后的值是 原先的 i ; i 的值加1
  • ++i:运算后的值是 原先的 i+1 ;i 的值加1
posted @ 2018-03-23 17:00  吴飞ff  阅读(132)  评论(0编辑  收藏  举报