weex 是阿里开发的一款 将 JavaScript 集成与 android 的一块框架(初步个人认为),但是里面的坑却又很多,官网第一板块开发环境搭建就有一个坑(报错 index 文件找不到,之后发现 ”

weex-vue-render" 这个包的问题,将 weex-vue-render 包的版本改成 "^0.10.4",否则跑不通);
   我们用的是 集成到 android 开发项目里, android 集成也有一个坑就是 weex 版本的问题,低版本不支持 vue 语法注意,因为根据 官方文档生成项目是 src 文件下面 .vue 结尾的文件,可以新建 .we 文件写 weex 语法,【不支持】 ,
这里有几个坑就是 插件包,如何集成到 android 项目下 使用 weex-toolkit 工具可以生成的 js 文件 放到 android 项目下得 main 文件下就OK了!

光标位置获取,设置,插入的操作

    var cursorPosition = {
        get: function (textarea) {
            var rangeData = {text: "", start: 0, end: 0};

            if (textarea.setSelectionRange) { // W3C 标准获取光标位置
                textarea.focus();
                rangeData.start = textarea.selectionStart;
                rangeData.end = textarea.selectionEnd;
                rangeData.text = (rangeData.start != rangeData.end) ? textarea.value.substring(rangeData.start, rangeData.end) : "";
            } else if (document.selection) { // IE
                textarea.focus();
                var i,
                    oS = document.selection.createRange(),
// Don't: oR = textarea.createTextRange()
                    oR = document.body.createTextRange();
                oR.moveToElementText(textarea);

                rangeData.text = oS.text;
                rangeData.bookmark = oS.getBookmark();

// object.moveStart(sUnit [, iCount])
// Return Value: Integer that returns the number of units moved.
                for (i = 0; oR.compareEndPoints('StartToStart', oS) < 0 && oS.moveStart("character", -1) !== 0; i++) {
// Why? You can alert(textarea.value.length)
                    if (textarea.value.charAt(i) == '\r') {
                        i++;
                    }
                }
                rangeData.start = i;
                rangeData.end = rangeData.text.length + rangeData.start;
            }

            return rangeData;
        },

        set: function (textarea, rangeData) { // 设置光标位置
            var oR, start, end;
            if (!rangeData) {
                alert("You must get cursor position first.")
            }
            textarea.focus();
            if (textarea.setSelectionRange) { // W3C
                textarea.setSelectionRange(rangeData.start, rangeData.end);
            } else if (textarea.createTextRange) { // IE
                oR = textarea.createTextRange();

// Fixbug : ues moveToBookmark()
// In IE, if cursor position at the end of textarea, the set function don't work
                if (textarea.value.length === rangeData.start) {
//alert('hello')
                    oR.collapse(false);
                    oR.select();
                } else {
                    oR.moveToBookmark(rangeData.bookmark);
                    oR.select();
                }
            }
        },

        add: function (textarea, rangeData, text) { // 向光标位置添加内容
            var oValue, nValue, oR, sR, nStart, nEnd, st;
            this.set(textarea, rangeData);

            if (textarea.setSelectionRange) { // W3C
                oValue = textarea.value;
                nValue = oValue.substring(0, rangeData.start) + text + oValue.substring(rangeData.end);
                nStart = nEnd = rangeData.start + text.length;
                st = textarea.scrollTop;
                textarea.value = nValue;
// Fixbug:
// After textarea.values = nValue, scrollTop value to 0
                if (textarea.scrollTop != st) {
                    textarea.scrollTop = st;
                }
                textarea.setSelectionRange(nStart, nEnd);
            } else if (textarea.createTextRange) { // IE
                sR = document.selection.createRange();
                sR.text = text;
                sR.setEndPoint('StartToEnd', sR);
                sR.select();
            }
        }
    }

看了看官方文档, 感觉自己看不下去,我只能用零碎的记忆碎片,来说一下我对node 理解
首先我们先来感受一下node开发

const http = require("http");// 引入htpp 模块
http.creacteServer((req, res) => { // 创建一个服务
res.statusCode = 200;
res.Header("Content-Type", "text/plain");
res.end("Hello World");
})

node开发中,模块, 回调利用好, 那么你会在开发中得心应手, node 重要模块中为 express 这个模块非常重要

let

let 方法  声明一个变量,这个变量的值可以改变, 与 var 不同的是他不会提升作用域, 而且变量声明之前赋值,会报错。 局部作用域,作用域外面拿不到。

const

const 方法 声明一个变量, 这个变量的值不可以改变, 但如果这个变量是对象,对象的值是可以改变的,为了安全考虑。 其他与 let 相同。

箭头函数 =>

=> 箭头函数 用法与 function 相同  区别:箭头函数 this 指向不会改变,也就是绑定了上下文 this 的指向;

  
示例:
  var fun = (val,opend)=>{ return val + opend };
  var Fun = function(val,opend){ return val + opend };

Symbol

ES5的对象属性名都是字符串,这容易造成属性名的冲突,例如你用的他人提供的方法,但又想为这个对象添加新的方法(mixin模式)新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是ES6引入Symbol的原因。
ES6引入了一种新的原始数据类型Symbol,表示独一无二的值。它是JavaScript语言的第七种数据类型,前六种是:Undefined、Null、布尔值(Boolean)、字符串(String)、数值(Number)、对象(Object)。
Symbol值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的Symbol类型。凡是属性名属于Symbol类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。

let s = Symbol();
typeof s
// "symbol"

上面代码中,变量s就是一个独一无二的值。typeof运算符的结果,表明变量s是Symbol数据类型,而不是字符串之类的其他类型。
注意,Symbol函数前不能使用new命令,否则会报错。这是因为生成的Symbol是一个原始类型的值,不是对象。也就是说,由于Symbol值不是对象,所以不能添加属性。基本上,它是一种类似于字符串的数据类型。
Symbol函数可以接受一个字符串作为参数,表示对Symbol实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。

不用不知道,一用就感觉自己的会的东西太少了:

数组属性 作用 返回值
arr.push(item1,item2…) 可以向数组最后添加一个或多个元素 返回数组的新长度,改变原数组。
arr.pop() 从数组最后删除一个元素 返回删除掉的元素值,改变原数组
arr.unshift(item1,item2…) 可以向数组前面添加一个或多个元素 返回数组的新长度,改变原数组
arr.shift() 从数组前面删除一个元素 返回删除掉的元素值,改变原数组
arry.join(“字符串”) 使用字符串连接数组的每一个元素 返回一个新的字符串,不改变原数组
arry.concat(一个或多个数组) 方法用于连接两个或多个数组 返回一个新数组,不改变原数组
arry.slice(start,end) 可以拷贝数组中从索引start开始,到end前一位的元素值,以数组形式返回。不改变原数组。 返回一个新数组,不改变原数组
arry.toString() 可以将数组转换为字符串形式(不常用) 返回字符串,不改变原数组
arry.indexOf(参数1,参数2) 参数1表示要找哪个元素,返回找到的索引值。第二个参数是一个索引值,表示从哪个位置开始查找。
没有找到,返回-1
查找到参数:返回索引值,没有就返回 -1(IE9 以上可用)
arry.reverse() 该方法用于颠倒元素的顺序 改变原来的数组,不会创建新的数组

一个很 Low 的程序员自述,因为机缘巧合的我无意间,接触到了计算机,这里我要感谢我的哥哥,也是我的启蒙老师。

首先作为一个程序员,要学会去总结,已经很长时间没有去停下来思考了,感觉有很多不足,到现在我还不了解 JavaScript 的底层原理,所以我还没有入门,在这里我希望可以记录下来工作与学习中的点点滴滴。