JavaScript类型转换深度学习

JavaScript 是一门弱类型语言,刚接触的时候感觉方便快捷(不需要声明变量类型了耶!),接触久了会发现它带来的麻烦有的时候不在预期之内

呵呵一笑,哪有这么夸张,可能有人看过这样一段代码


  1. [][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(![]+[])[+!+[]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+(!![]+[])[!+[]+!+[]+!+[]]+([]+[])[(![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]()[+!+[]+[!+[]+!+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]])() 

这个占了好大的篇幅哈 3167 个字符,粘贴到浏览器的 Console 控制台,直接弹出了 orange,随叫随到有不有

对于不知道原理出处的给大家一个地址:http://www.jsfuck.com/

JSFuck 的变态程度达到了极致,因为它的理念是 Write any JavaScript with 6 Characters: []()!+

或许又有人说:这个只是搞怪的吧,实际谁这么写代码啊

说的没错,当一段代码变得晦涩难懂的时候,甚至到上文的混乱字符(天书),却能实现任意功能这就变得不可预期,也就是说 JS 代码的安全性没有保障

当然本文不会研究这些无意义的字符原理是怎么实现的因为人家的 Github 文档已经描述的特别全面了,感兴趣的可以研究下:https://github.com/aemkei/jsfuck

我们聊一聊每天能看到用到的方法底层是怎么解析的,熟知转换分成两种一种是隐式转换,另一种是强制的类型转换

隐式转换

当遇到以下几种情况,JavaScript会自动转换数据类型:

  • 不同类型的数据进行互相运算
  • 对非布尔值类型的数据求布尔值
  • 对非数值类型的数据使用一元运算符(即 "+" 和 "-")

隐式转换为 Boolean

大多数在做 if 判断时会用到,这里只需记住六个转换为 false,其它全部为 true

  • null
  • undefined
  • NaN
  • ''
  • -0
  • +0

隐式转换为 String

字符串的自动转换,主要发生在加法运算时。当一个值为字符串,另一个值为非字符串,则后者转为字符串。


  1. '1' + 2  // '12' 
  2. '1' + true  // "1true" 
  3. '1' + false  // "1false" 
  4. '1' + {}  // "1[object Object]" 
  5. '1' + []  // "1" 
  6. '1' + function (){}  // "1function (){}" 
  7. '1' + undefined  // "1undefined" 
  8. '1' + null  // "1null"  

隐式转换为 Number

除了加法运算符有可能把运算子转为字符串,其他运算符都会把两侧的运算子自动转成数值


  1. '5' - '2'  // 3 
  2. '5' * '2'  // 10 
  3. true - 1  // 0 
  4. false - 1  // -1 
  5. '1' - 1  // 0 
  6. '5' * []  // 0 
  7. false / '5'  // 0 
  8. 'abc' - 1  // NaN 
  9. +'abc'  // NaN 
  10. -'abc'  // NaN 
  11. +true  // 1 
  12. -false  // 0  

隐式转换的基础表现都在这了,强调的是这些转换的背后都伴随着强制转换,使用 Boolean、Number 和 String,下面重点讲一下强制转换的原理

强制转换

看到上面例子也许你已经有些许疑问了,比如上面的这个 '1' + {} 怎么就输出 1[object Object] 了呢

如上面强调的,你会猜测首先执行 String({}) 得到 "[object Object]" ,然后再字符串拼接,是的我们总能得到转换背后的实现原理,其实真实原理要比这个复杂,见下文

强制转换为 Boolean

这里略过因为与隐式转换相同,切记 []、{} 都转换成 true

强制转换为 String

基本类型的转换结果与隐式转换相同,这里说一下对象的转换,加深上面引用例子的解析

对象转换字符串分成三步

  • 先调用toString方法,如果toString方法返回的是原始类型的值,则对该值使用String方法,不再进行以下步骤
  • 如果toString方法返回的是复合类型的值,再调用valueOf方法,如果valueOf方法返回的是原始类型的值,则对该值使用String方法,不再进行以下步骤
  • 如果valueOf方法返回的是复合类型的值,则报错

再分解这个例子


  1. String({}) 
  2. // "[object Object]"  

上面代码相当于下面这样


  1. String({}.toString()) 
  2. // "[object Object]"  

如果 toString 方法和 valueOf 方法,返回的都不是原始类型的值,则 String 方法报错


  1. var obj = { 
  2.   valueOf: function () { 
  3.     console.log("valueOf"); 
  4.     return {}; 
  5.   }, 
  6.   toString: function () { 
  7.     console.log("toString"); 
  8.     return {}; 
  9.   } 
  10. }; 
  11.  
  12. String(obj) 
  13. // TypeError: Cannot convert object to primitive value  

我们不难看出可以对 toString 方法和 valueOf 方法进行改写,测试其先后运行的顺序也简单的多


  1. String({toString:function(){return 3;}}) 
  2. // "3" 
  3.  
  4. String({valueOf:function (){return 2;}}) 
  5. // "[object Object]" 
  6.  
  7. String({valueOf:function (){return 2;},toString:function(){return 3;}}) 
  8. // "3"  

结果表示toString方法先于valueOf方法执行

强制转换为 Number

基本类型转换如下


  1. Number("123") // 123 
  2.  
  3. Number("123abc") // NaN 
  4.  
  5. Number("") // 0 
  6.  
  7. Number(false) // 0 
  8.  
  9. Number(undefined) // NaN 
  10.  
  11. Number(null) // 0  

对象转换一样要复杂些,与 String 唯一不同的就是 valueOf 方法在前, toString 方法在后,其它不赘述见上文例子。

isNaN() 并不陌生,isNaN({}) //true 的内在转换过程是相同的

总结

其它的转换原则还有很多,看到这我们还是不能解释文章开始的代码转换的过程,掌握这些更多是保证正常书写代码规避错误的发生,十分好奇的可以研究下比较特殊的转化原则,还有好多好多。

作者:orangexc

来源:51CTO

时间: 2024-08-04 05:17:50

JavaScript类型转换深度学习的相关文章

【笔谈】Github上新鲜出炉的深度学习系统mxnet的中文介绍

凌晨时看到一篇,新鲜出炉的深度学习系统mxnet的文章.关键已经有了中文介绍,译者是muli@cs.cmu.edu,地址在https://github.com/dmlc/mxnet/issues/797. 内容如下: MXNet设计和实现简介 神经网络本质上是一种语言,我们通过它来表达对应用问题的理解.例如我们用卷积层来表达空间相关性,RNN来表达时间连续性.根据问题的复杂性和信息如何从输入到输出一步步提取,我们将不同大小的层按一定原则连接起来.近年来随着数据的激增和计算能力的大幅提升,神经网络

深度学习必备手册(上)

更多深度文章,请关注云计算频道:https://yq.aliyun.com/cloud 请收下这份关于人工智能的根目录--博客整理系列(一) 关于数据科学的那些事--博客整理系列(二) 机器学习必备手册--博客整理系列(三) 扩展眼界的都在这--博客整理系列(四) 深度学习必备手册--博客整理系列(六) 深度学习的概念源于人工神经网络的研究,如果追溯深度学习的概念还是要回到2006年Hinton那篇论文,基于深信度网(DNB)提出非监督贪心逐层训练算法,未解决深层结构相关的优化难题出现的论文.

比人工还准确!看深度学习如何对源码进行分类

编程语言是软件开发行业的主要工具.自20世纪40年代以来,已经出现了数百种编程语言,并且每天都有大量的各种编程语言的代码被推送到代码库中. 我们认为,根据代码识别编程语言的源代码分类器将是一个非常有用的工具,因为它可用于在线自动语法高亮和标签建议,比如可用在StackOverflow和技术维基网站上.这个想法促使我们根据最新的AI技术编写一个对代码片段依据编程语言进行分类的模型. 我们使用GitHub API从GitHub上收集了数十万个源代码文件.在训练模型之前,必须处理原始数据以消除和减少一

2016深度学习统治人工智能?深度学习十大框架

2015 年结束了,是时候看看 2016 年的技术趋势,尤其是关于深度学习方面.新智元在 2015 年底发过一篇文章<深度学习会让机器学习工程师失业吗?>,引起很大的反响.的确,过去一年的时间里,深度学习正在改变越来越多的人工智能领域.Google DeepMind 工程师 Jack Rae 预测说,过去被视为对于中型到大型数据集来说最佳的预测算法的那些模型(比如说提升决策树(Boosted Decision Trees)和随机森林)将会变得无人问津. 深度学习,或者更宽泛地说--使用联结主义

DeepTraffic: 如何让MIT的游戏利用深度学习来减少交通阻塞

大家都对交通阻塞深恶痛绝.除了让人头疼和错过约会之外,交通拥堵让美国的司机每年多花3000亿美元. 研究人员建议大家使用自动驾驶汽车,即使数量占比并不大,但也能大大改善交通拥堵情况. Lex Fridman和他的MIT团队开发了一款模拟游戏来加速实现这个未来. DeepTraffic模拟的是典型的公路环境,玩家使用深度学习技术来控制自己的汽车.这款模拟游戏让初学者也能接触并使用复杂的技术概念,同时也推动专家们去开发全新的技术. 采用神经网络的交通游戏 假设你在洛杉矶一条拥挤的高速公路上开车.你必

良心推荐!机器学习和深度学习最佳框架

文章讲的是良心推荐!机器学习和深度学习最佳框架,机器学习框架和深度学习框架之间是有区别的.本质上,机器学习框架涵盖用于分类,回归,聚类,异常检测等各种学习方法,并且其可以不包括神经网络方法.深度学习或深度神经网络(DNN)框架涵盖具有许多隐藏层的神经网络拓扑.层越多,可用于聚类和分类的特征越复杂. Caffe,CNTK,DeepLearning4j,Keras,MXNet和TensorFlow是深度学习框架.Scikit-learning和Spark MLlib是机器学习框架.而Theano跨越

机器学习和深度学习的最佳框架大比拼

在过去的一年里,咱们讨论了六个开源机器学习和/或深度学习框架:Caffe,Microsoft Cognitive Toolkit(又名CNTK 2),MXNet,Scikit-learn,Spark MLlib和TensorFlow.如果把网撒得大些,可能还会覆盖其他几个流行的框架,包括Theano(一个10年之久的Python深度学习和机器学习框架),Keras(一个Theano和TensorFlow深度学习的前端),DeepLearning4j(Java和Scala在Hadoop和Spark

独家 | 一文读懂深度学习

Figure1. Deep learning导图   前言 深度学习(deep learning)的概念最早可以追溯到1940-1960年间的控制论(cybernetics),之后在1980-1990年间发展为连接主义(connectionism),第三次发展浪潮便是2006年由人工神经网络(Artificial neural network)扩展开来并发展成为今天十分火热的深度学习(Figure 2).实际上,深度学习的兴起和发展是非常自然的,人们在应用经典的机器学习方法时,需要对具体的问题或

GitHub 上 57 款最流行的开源深度学习项目

GitHub 上 57 款最流行的开源深度学习项目 本文整理了 GitHub 上最流行的 57 款深度学习项目(按 stars 排名).最后更新:2016.08.09 1.TensorFlow 使用数据流图计算可扩展机器学习问题 TensorFlow 是谷歌的第二代机器学习系统,按照谷歌所说,在某些基准测试中,TensorFlow 的表现比第一代的 DistBelief 快了2倍. TensorFlow 内建深度学习的扩展支持,任何能够用计算流图形来表达的计算,都可以使用 TensorFlow.