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 为true,null 和其它类型数据判断 都是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